【问题标题】:bytes.Buffer ReadFrom differ from r.Read?bytes.Buffer ReadFrom 与 r.Read 不同?
【发布时间】:2018-03-15 05:01:03
【问题描述】:

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

从读取器读取字节片时,每次写入后读取都会返回,但是,当使用 ReadFrom 时,它不会停止读取,直到写入器关闭。这个:

    buf := &bytes.Buffer{}
    nIn, err = buf.ReadFrom(r)

在返回之前读取所有十行,而:

    buf := make([]byte, 64)
    nIn, err = r.Read(buf)

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

【问题讨论】:

  • 您咨询过thedocs吗?
  • 似乎我错过了这部分:如果某些数据可用但 len(p) 字节不可用,则读取通常会返回可用的数据,而不是等待更多。
  • 是的。那是因为它紧跟read(2) OS 系统调用的作用。如果您需要不同的行为,请使用 io.ReadFull 助手。

标签: go buffer


【解决方案1】:

io.Reader (Read) 的行为被定义为不同于io.ReadFrom

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2020-11-23
    • 2019-10-21
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多