単一の io.Reader から複数回読み取る
Go では、ソースからデータを読み取るために io.ReadCloser インターフェイスを使用すると、何度も読み取ろうとするときはチャレンジしてください。例として、ファイルへの直接書き込みとデコードの両方に、画像を含む request.Body (タイプ io.ReadCloser) を使用するシナリオを考えてみましょう。
問題:
次のコードのように、リーダーの複数のインスタンスを作成しようとすると、2 番目の呼び出しで nil が返されます。値:
package main import ( "io/ioutil" "log" "strings" ) func main() { r := strings.NewReader("some io.Reader stream to be read\n") a := &r b := &r log.Println(ioutil.ReadAll(*a)) log.Println(ioutil.ReadAll(*b)) }
解決策:
io.Reader インターフェイスはストリームをモデル化します。つまり、ストリームを 2 回読み取ることはできません。この制限を克服するには、io.TeeReader 関数を利用して重複ストリームを作成します。
package main import ( "bytes" "io" "io/ioutil" "log" "strings" ) func main() { r := strings.NewReader("some io.Reader stream to be read\n") var buf bytes.Buffer tee := io.TeeReader(r, &buf) log.Println(ioutil.ReadAll(tee)) log.Println(ioutil.ReadAll(&buf)) }
このコードは、io.TeeReader を使用して r から重複ストリームを作成し、両方にコンテンツを書き込む方法を示しています。ティーとバフ。最初にティーから読み取ることで、バッファーにストリームのコンテンツが確実に入力されるようにすることができます。
以上がGo で io.Reader から複数回読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。