【发布时间】:2018-03-15 05:01:03
【问题描述】:
我有一种情况,我想从 io Reader 获取数据流并在将其作为流通过 http post 发送之前对其进行缓冲,以防连接错误。为此,我打算使用 bytes.Buffer 并从阅读器复制到缓冲区。一个单独的 goroutine 将从缓冲区中读取并将读取器传递给 http.Request。
现在,bytes.Buffer ReadFrom 的行为不是我所期望的。我正在用管道模拟数据流:
r, w := io.Pipe()
go func() {
for i := 0; i < 10; i++ {
w.Write([]byte(fmt.Sprintf("foobar %d\n", i)))
time.Sleep(200 * time.Millisecond)
}
w.Close()
}()
从读取器读取字节片时,每次写入后读取都会返回,但是,当使用 ReadFrom 时,它不会停止读取,直到写入器关闭。这个:
buf := &bytes.Buffer{}
nIn, err = buf.ReadFrom(r)
在返回之前读取所有十行,而:
buf := make([]byte, 64)
nIn, err = r.Read(buf)
在每一行之后返回。为什么行为不同?
【问题讨论】:
-
似乎我错过了这部分:如果某些数据可用但 len(p) 字节不可用,则读取通常会返回可用的数据,而不是等待更多。
-
是的。那是因为它紧跟
read(2)OS 系统调用的作用。如果您需要不同的行为,请使用io.ReadFull助手。