字节.Buffer ReadFrom 不同于 r.Read



我有一种情况,我想从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不同。

最新更新