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

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

Patricia Arquette
リリース: 2024-12-18 19:36:11
オリジナル
926 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート