在连接错误的情况下,我想从 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()
}()
当从读取器读取 byte slice 时,每次写入后 Read 返回,但是,当使用 ReadFrom 时,它不会停止读取直到写入器关闭。这:
buf := &bytes.Buffer{}
nIn, err = buf.ReadFrom(r)
在返回前阅读所有十行,同时:
buf := make([]byte, 64)
nIn, err = r.Read(buf)
在每一行之后返回。为什么行为不同?
最佳答案
io.Reader
的行为(Read
) 被定义为不同于 io.ReadFrom
.
关于go - bytes.Buffer ReadFrom 与 r.Read 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49291920/