bytes.Buffer ReadFrom与r.Read?

时间:2018-03-15 05:01:04

标签: go buffer

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

在每一行之后返回。为什么行为不同?

1 个答案:

答案 0 :(得分:1)

io.ReaderRead)的行为定义为与io.ReadFrom不同。