gitalk
gitalk copied to clipboard
从 io.Reader 中读数据
https://colobu.com/2019/02/18/read-data-from-net-Conn/
你好,看了你的文章受益良多!
关于io.Read,文章里有这样说:
- 当输入流结束时,调用它可能返回
err == EOF或者err == nil,并且n >=0, 但是下一次调用肯定返回n=0,err=io.EOF
常常使用这个方法从输入流中批量读取数据,直到输入流读取到头,但是需要注意的时候,我们应该总是先处理读取到的n个字节,然后再处理error。
按照文章的说法,处理读取的时候是不是应该改成这样?
func main() {
...
// 读取response
var sb strings.Builder
buf := make([]byte, 256)
for {
n, err := conn.Read(buf)
if err != nil {
if n > 0 {
sb.Write(buf[:n])
}
if err != io.EOF {
fmt.Println("read error:", err)
}
break
}
sb.Write(buf[:n])
}
...
}
另外,请教个问题,如果Read方法返回的err是io.EOF,那么读取的字节数n一定是0么?
应该是