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

我正在玩 Golang tour,我想知道为什么使用裸返回给我正确的结果,而正常的却没有。这是我遇到这个问题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)

}

这不会改变输入流的任何内容。


有人能解释一下为什么吗?先感谢您。


芜湖不芜
浏览 171回答 2
2回答

守候你守候我

该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 }

慕斯王

返回不是问题,但在第一种情况下,您在转换数据之前读取数据,在第二种情况下,您在缓冲区中转换垃圾,然后才读取数据(并简单地传递已读取的数据)来自底层读者)。虽然这不是必需的正确性,我建议你不要每次都变换整个缓冲区,而只是说已经阅读改变你的第一个例子中的部分,即for i, v := range b到for i, v := range b[:n]。那是因为io.Readcall 不能修改 slice 的长度b,而只能修改它的内容。看一看 的文档io.Reader,它应该会让您对这个界面的预期工作方式有更多的了解。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go