为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
芜湖不芜 2021-10-18 10:58:42
我正在玩 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)}这不会改变输入流的任何内容。有人能解释一下为什么吗?先感谢您。
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

该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 

}


查看完整回答
反对 回复 2021-10-18
?
慕斯王

TA贡献1864条经验 获得超2个赞

返回不是问题,但在第一种情况下,您在转换数据之前读取数据,在第二种情况下,您在缓冲区中转换垃圾,然后才读取数据(并简单地传递已读取的数据)来自底层读者)。

虽然这不是必需的正确性,我建议你不要每次都变换整个缓冲区,而只是说已经阅读改变你的第一个例子中的部分,即for i, v := range bfor i, v := range b[:n]。那是因为io.Readcall 不能修改 slice 的长度b,而只能修改它的内容。

看一看 的文档io.Reader,它应该会让您对这个界面的预期工作方式有更多的了解。


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信