ホームページ >バックエンド開発 >Golang >Go で複数の読み取り操作のために io.Reader を複製するにはどうすればよいですか?

Go で複数の読み取り操作のために io.Reader を複製するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-25 02:06:13815ブラウズ

How Can I Duplicate an io.Reader for Multiple Read Operations in Go?

複数の操作のための io.Reader インスタンスの複製

問題

request.Body のような io.ReadCloser 型を操作する場合、問題が発生する可能性があります複数の操作を実行したい場合 (ファイルへの書き込みとデコードなど)。 ioutil.ReadAll() への直接呼び出しはストリーム全体を消費し、その後の操作が不可能になります。

解決策: io.TeeReader を使用する

直接読み取りとは異なり、io.TeeReader を使用するとユーザーは io を複製できます。リーダー ストリーム。同じコンテンツへの複数の参照を可能にします。これにより、同じデータを 2 回読み取る問題が解決されます。

実装

io.TeeReader を使用した実装は次のとおりです。

package main

import (
    "bytes"
    "io"
    "io/ioutil"
    "log"
    "strings"
)

func main() {
    r := strings.NewReader("io.Reader contents to be read")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)

    // Perform the first operation using tee.
    log.Println(ioutil.ReadAll(tee))

    // Perform the second operation using the duplicated content in the buffer.
    log.Println(ioutil.ReadAll(&buf))
}

Notes

  • 最初に TeeReader から読み取ることを忘れずに行ってください。 buffer.
  • ストリームの異なる部分への複数の参照を作成する必要がある場合は、io.MultiReader または io.PipeReader.
を使用します。

以上がGo で複数の読み取り操作のために io.Reader を複製するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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