io - 如何将字节推送到 Go 中的读取器中?

标签 io go

我需要在接收到字节时将它们递增地追加到缓冲区中,以便稍后再次读取它们。像这样:

type TwoPassReader struct {
  someDataSource SomeDataReader
  secondPassReader io.Reader
}

func (r *TwoPassReader) Read(b []byte) (n int, err error) {
  n, err := r.someDataSource.Read(b)
  if err == nil {
    //XXX: this doesn't actually exist, right?
    bytesAppended, writeErr := r.secondPassReader.Write(b)
  }
  return n, err
}

func (r *) ReadSecondPass(b []byte) (n int, err error) {
  return r.secondPassReader.Read(b)
}

虽然这个问题的简单答案是使用 bufio.Reader.Peek,但我有一个无法修改的 SomeDataReader 对象,而不是 Reader。最好的解决方案是将数据放入 []byte 并在调用 ReadSecondPass 时返回它吗?

最佳答案

是这样的吗?

package main

import (
    "bytes"
    "io"
)

type TwoPassReader struct {
    firstPassReader  io.Reader
    secondPassBuffer io.ReadWriter
}

func NewTwoPassReader(firstPass io.Reader) *TwoPassReader {
    return &TwoPassReader{
        firstPassReader:  firstPass,
        secondPassBuffer: bytes.NewBuffer(nil),
    }
}

func (r *TwoPassReader) Read(b []byte) (n int, err error) {
    n1, err1 := r.firstPassReader.Read(b)
    n2, err2 := r.secondPassBuffer.Write(b[:n1])
    if err2 != nil {
        return n2, err2
    }
    return n1, err1
}

func (r *TwoPassReader) ReadSecondPass(b []byte) (n int, err error) {
    return r.secondPassBuffer.Read(b)
}

func main() {
}

关于io - 如何将字节推送到 Go 中的读取器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20666594/

相关文章:

java - 从 Java 文件中读取特定行

memory - 声明非常大的数组并迭代 stdin 时内存持续增加

floating-point - 常量截断为整数

go - 基于 YAML 字段将 YAML 解码为不同的结构

c++ - CERN 根目录 : generate streamer for an extern "C" struct in a namespace

python - 使用Python执行cmd命令

go - 使用字符串定义的类型值作为字符串

linux - 无法在 Linux 上的 goroutine 中运行 go web serve (Mint)

Python:文件不读取整个文件,io.FileIO 读取 - 为什么?

python:打开文件,编辑一行,另存为同一个文件