当我尝试手动从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
是必要的? 编辑:第二个代码段运行良好,没有任何运行时错误,只是行为不正确。我想知道n>0
检查的效果是什么,当我删除它时会在表面下发生什么。
答案 0 :(得分:0)
已经有一个函数io.Copy
可以做到这一点。您可以see how it's implemented作为一个很好的例子。它适用于所有io.Reader
/ io.Writer
类型。
答案 1 :(得分:0)
我想通了:没有n
,它会将整个缓冲区(32 * 1024字节)写入Writer而不仅仅是n
字节,这就是奇怪行为的来源。 / p>