当我尝试手动从 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 接口(interface)的类型是必需的?
编辑:第二个片段运行良好,没有任何运行时错误,只是行为不正确。我想知道 n>0
检查的效果是什么,以及当我删除它时表面下会发生什么。
最佳答案
已经有一个函数io.Copy
做到这一点。你可以see how it's implemented一个很好的例子。它适用于所有 io.Reader
/io.Writer
类型。
关于go - 从 Reader 读取并写入 Golang 中的 Writer 时是否需要检查非零长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974343/