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

时间:2013-12-18 19:17:54

标签: 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时返回的最佳解决方案吗?

2 个答案:

答案 0 :(得分:2)

这样的东西?

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

答案 1 :(得分:1)

io.Reader只是一个界面。我们无法看到您分配给该结构域的内容(如果有的话),但bytes.Buffer可能是这里使用的正确类型。