You need to enable JavaScript to run this app. Go基于字节而非字符串实现ROT13时多余字符问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 21:48:02