gitalk icon indicating copy to clipboard operation
gitalk copied to clipboard

从 io.Reader 中读数据

Open smallnest opened this issue 6 years ago • 2 comments

https://colobu.com/2019/02/18/read-data-from-net-Conn/

smallnest avatar Feb 19 '19 16:02 smallnest

你好,看了你的文章受益良多!

关于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么?

cool-firer avatar Oct 22 '21 08:10 cool-firer

应该是

aeof avatar May 09 '22 01:05 aeof