2012-05-30 12 views
5

bufioパッケージのReadBytesメソッドでほぼ満たされる機能を必要とするコードを書いています。具体的には、そのメソッドは、特定のバイトを検出するまでReaderから読み取ります。 2バイトのうち1バイト(スペース、改行、タブを中心に扱う)が出てくるまで読み込むものが必要です。既存の(標準)パッケージに新しい関数を追加する

ライブラリのソースを見て、bufio構造体で使用される内部バッファにアクセスできる場合はどうすればよいか知っています。私はパッケージを "サルパッチ"して別の方法を2つ追加する方法はありますか?または私が必要とする機能を得る別の方法は?このアプローチに沿って

+1

プライベートな隠しフィールドがある主な理由は、実装が今後ユーザーに影響を与えずに進化することを可能にすることです。バイトへのアクセスを許可すると、この保証が破られます。だから私はあなた自身の(限られた)リーダー構造とメソッドを作る以外の適切な方法を見ていない。 –

+2

あなたの本当の問題(特定のデータ形式を読むこと)を念頭に置いて、あなたが念頭に置いておいた1つの解決法(強化されたbufio)について解答とコメントが示すように、Goのパッケージ機能は実際には、他のソリューションを検討したり、データフォーマットの詳細をついて別の質問を投稿して、「この複数区切り形式を読み込む良い方法は何ですか?」と尋ねる方がよいでしょう。 – Sonia

答えて

5

何か(注意:未テストコード):

type reader struct{ 
     *bufio.Reader // 'reader' inherits all bufio.Reader methods 
} 

func newReader(rd io.Reader) reader { 
     return reader{bufio.NewReader(rd)} 
} 

// Override bufio.Reader.ReadBytes 
func (r reader) ReadBytes(delim byte) (line []byte, err error) { 
     // here goes the monkey patch 
} 

// Or 

// Add a new method to bufio.Reader 
func (r reader) ReadBytesEx(delims []byte) (line []byte, err error) { 
     // here goes the new code 
} 

編集:私はこのは、元のパッケージの内部(非エクスポートされたエンティティ)にアクセスする助けをしないことに注目している必要があります。あなたのコメントでそれを指摘してくれてありがとうAbhay。

+0

この方法で、bufio.Readerの非公開フィールドにアクセスできますか? –

+1

残念ながら、これは呼び出しが内部構造体に委譲されるように思われます。構造体全体は依然として新しい構造体に埋め込まれており、依然として別のエンティティのように扱われます。実際にはパッケージローカル変数にはアクセスできません。しかし、試みてくれてありがとう! –

1

通常、パッケージAPIを使用して問題を解決することをお勧めします。ただし、非エクスポート機能にアクセスする魅力的な理由がある場合は、パッケージのソースをコピーしてハックアップしてください。 BSDスタイルのライセンスは、彼らが来るほどリベラルなものです。

関連する問題