我有一种情况,我想从io阅读器获取数据流并在通过http post将其作为流发送之前对其进行缓冲,以防连接错误。为此,我打算使用字节。缓冲并从读取器复制到缓冲区。一个单独的goroutine将从缓冲区读取并将读取器传递给http。请求。
现在,来自字节的行为。缓冲区读取不是我所期望的。我正在用管道模拟数据流:
r, w := io.Pipe()
go func() {
for i := 0; i < 10; i++ {
w.Write([]byte(fmt.Sprintf("foobar %dn", 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)
在每行之后返回。为什么行为不同?
io.Reader
(Read
(的行为被定义为与io.ReadFrom
不同。