我需要逐步追加字节,因为我将它们接收到缓冲区,以后我可以再次读取它们。像这样:
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
时返回的最佳解决方案吗?
答案 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可能是这里使用的正确类型。