ホームページ >バックエンド開発 >Golang >Go で io.Reader から複数回読み取るにはどうすればよいですか?

Go で io.Reader から複数回読み取るにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-18 19:36:11922ブラウズ

How Can I Read from an io.Reader Multiple Times in Go?

単一の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。