我有一种情况,我想从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()
}()
当从读取器读取字节切片时,Read会在每次写入后返回,但是,在使用ReadFrom时,它会在写入器关闭之前停止读取。这样:
buf := &bytes.Buffer{}
nIn, err = buf.ReadFrom(r)
在返回之前读取所有十行,而:
buf := make([]byte, 64)
nIn, err = r.Read(buf)
在每一行之后返回。为什么行为不同?