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中做第二次传球。