为什么使用裸回归和正常回报给我不同的结果?

时间:2015-06-18 10:10:31

标签: go rot13

我正在玩Golang之旅,我想知道为什么使用裸回报给我正确的结果,但正常的结果并非如此。这是我遇到此问题的练习https://tour.golang.org/methods/12

目标是创建一个可以解密rot13的读者。 rot13功能已经过测试。

func (r rot13Reader) Read(b []byte) (n int, err error) {
    n, err =  r.r.Read(b)
    for i, v := range b {
        b[i] = rot13(v)
    }
    return
}

上面的代码给出了正确的结果。

func (r rot13Reader) Read(b []byte) (int, error) {
    for i, v := range b {
    b[i] = rot13(v)
    }
    return r.r.Read(b)
}

这并没有改变输入流中的任何内容。

有人可以解释原因吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

Read()操作会改变输入数组b。在第二个示例中,rot13()操作会覆盖Read()操作。此外,rot13()操作是在将任何数据读入数组之前执行的,因此您可能对垃圾数据执行rot13()

如果你想要第二个例子,你需要写下这样的东西:

func (r rot13Reader) Read(b []byte) (int, error) {
    n, err := r.r.Read(b)
    for i, v := range b {
    b[i] = rot13(v)
    }
    return n, err 
}

答案 1 :(得分:3)

这不是返回的问题,但是在第一种情况下,你在转换之前读取数据,在第二种情况下,你在缓冲区中转换垃圾,然后只读取数据(并简单地传递已从基础读者阅读。)

虽然这不是正确性所必需的,但我建议你不要每次都转换整个缓冲区,而只修改已经读过的部分,即将第一个例子从for i, v := range b改为{{1 }}。这是因为for i, v := range b[:n]调用无法修改切片io.Read的长度,只能修改其内容。

看一下io.Reader的文档,它应该让你更多地了解这个界面应该如何工作。