2013-12-18 37 views
3

我需要增量追加字節,因爲我將它們接收到緩衝區,以便稍後再讀取它們。事情是這樣的:如何將字節推入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對象,我不能修改的,而不是一個讀者。將數據放入[]byte的最佳解決方案是在調用ReadSecondPass時返回該數據嗎?

回答

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

This works great。我最終不需要按照我嘗試的方式這樣做,一個頻道最終變得更加合適,因爲我想在一個公用事業中進行第二次傳球。 – simpleproof

1

io.Reader只是一個界面。我們無法看到您指定給該結構字段的內容(如果有的話),但bytes.Buffer可能是此處使用的正確類型。