在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
,这就是我如何意识到我错在哪里的原因。