Go基于字节而非字符串实现ROT13时多余字符问题咨询
问题原因与解决方案
你看到的多余异常内容是打印输出时的操作错误导致:你直接打印了自定义的ROT13转换结构体实例,而非仅打印结构体中存储转换结果的有效字节字段,那些{、0 0}、%!s(int=0)等内容都是Go打印结构体时输出的结构体边界、未初始化的成员字段值。
去除异常内容的方法
- 打印输出时仅提取转换后的有效字节切片,不要直接将整个自定义结构体传入打印函数
- 如果是通过
io.Reader接口实现的ROT13转换,读取后仅输出读取到的有效长度内的buf内容,不要打印Reader实例本身
更优的字节级ROT13实现
直接实现io.Reader接口,可无缝嵌入你现有读写逻辑,不需要修改原有代码结构:
type rot13Reader struct { r io.Reader } func (r rot13Reader) Read(b []byte) (int, error) { n, err := r.r.Read(b) for i := 0; i < n; i++ { switch { case b[i] >= 'A' && b[i] <= 'Z': b[i] = 'A' + (b[i]-'A'+13)%26 case b[i] >= 'a' && b[i] <= 'z': b[i] = 'a' + (b[i]-'a'+13)%26 } // 非字母字符不做修改直接保留 } return n, err }
你原有代码可以直接套用这个实现,不需要调整原有读写流程:
// 原来的in是你的输入Reader,直接套一层rot13Reader即可完成转译 in = rot13Reader{r: in} // 后续读写代码完全不用修改 buf := make([]byte, 1024) for { n, err := in.Read(buf) if err != nil { // 处理错误逻辑 break } for _, chunk := range split(r, buf[:n], sizes) { if _, err := out.Write(chunk); err != nil { // 处理错误逻辑 } } }
内容的提问来源于stack exchange,提问作者hyogy
相关产品推荐
相关产品推荐

