Io 如何在Go中将字节推入读卡器?

Io 如何在Go中将字节推入读卡器?,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 { //

我需要在接收字节时将其增量附加到缓冲区,以便以后再次读取。大概是这样的:

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。将数据放入
[]字节,并在调用
ReadSecondPass
时返回该字节是最好的解决方案吗?

io。Reader
只是一个接口。我们看不到您分配给该结构字段的内容(如果有的话),但a可能是此处要使用的正确类型

像这样的

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() {
}

这很有效。我最终不需要像我尝试的那样去做,一个频道更适合我,因为我想在一个goroutine中做第二次传球。