在Golang从读卡器读取和写入时,是否有必要检查长度是否为非零?

在Golang从读卡器读取和写入时,是否有必要检查长度是否为非零?,go,Go,当我尝试手动从读卡器复制到写卡器时,我注意到这是有效的: 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(bu

当我尝试手动从读卡器复制到写卡器时,我注意到这是有效的:

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)
    }
}
因此,问题是:

  • 如果n>0,为什么需要检查
    
    
  • 这是否仅对net.Conn或任何实现读写器接口的类型是必需的

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

已经有一个函数可以精确地执行此操作。你可以举个好例子。它适用于所有的
io.Reader
/
io.Writer
类型。

已经有了一个函数来实现这一点。你可以举个好例子。它适用于所有
io.Reader
/
io.Writer
类型。

我发现:如果没有
n
,它会将整个缓冲区(32*1024字节)写入写入写入器,而不仅仅是
n
字节,这就是奇怪行为的根源。

我发现:如果没有
n
,它会写入整个缓冲区(32*1024字节)对编写者来说,这不是
n
字节,而是奇怪行为的根源。

这在@JimB中有详细的解释,文档只建议如何处理错误。第二个代码段运行良好,没有检查
n>0
,没有报告运行时错误,但行为很奇怪。是的,您可以在没错,但是文档显示了如何处理读取的数据和错误,以便您获得正确的行为。这在@JimB中有详细的解释。文档只建议如何处理错误。第二个代码段运行良好,没有检查
n>0
,没有报告运行时错误,但行为很奇怪。是的,您可以自由执行它不正确,但文档显示了如何处理读取的数据和错误,以便您获得正确的行为。是的,我阅读了
io.Copy
,这就是我如何意识到我错在哪里的原因。是的,我阅读了
io.Copy
,这就是我如何意识到我错在哪里的原因。