从Reader读取并在Golang中写入Writer时是否需要检查非零长度?

时间:2017-07-07 15:17:59

标签: go

当我尝试手动从Reader复制到Writer时,我注意到这有效:

func fromAToB(a, b net.Conn) {
    buf := make([]byte, 1024*32)
    for {
        n, err := a.Read(buf)
        if n > 0 {
            if err != nil {
                log.Fatal(err)
            }
            b.Write(buf[0:n])
        }
    }
} 

但这不是

func fromAToB(a, b net.Conn) {
    buf := make([]byte, 1024*32)
    for {
        _, err := a.Read(buf)
        if err != nil {
            log.Fatal(err)
        }
        b.Write(buf)
    }
}

所以问题是:

  • 为什么检查if n>0是必要的?
  • 这只是net.Conn或任何实现Reader和Writer接口的类型所必需的吗?

编辑:第二个代码段运行良好,没有任何运行时错误,只是行为不正确。我想知道n>0检查的效果是什么,当我删除它时会在表面下发生什么。

2 个答案:

答案 0 :(得分:0)

已经有一个函数io.Copy可以做到这一点。您可以see how it's implemented作为一个很好的例子。它适用于所有io.Reader / io.Writer类型。

答案 1 :(得分:0)

我想通了:没有n,它会将整个缓冲区(32 * 1024字节)写入Writer而不仅仅是n字节,这就是奇怪行为的来源。 / p>