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

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

Barbara Streisand
リリース: 2024-12-16 14:26:18
オリジナル
334 人が閲覧しました

How to Read from an io.Reader Multiple Times?

同じ io.Reader から複数回読み取る方法

request.Body などの io.Reader を操作する場合、画像などのデータが含まれている場合、コンテンツに複数回アクセスする必要がある場合があります。ただし、ioutil.ReadAll() を使用するとコンテンツ全体が消費され、その後の読み取りが不可能になります。

課題

次に示すように、リーダーの複数のインスタンスを作成しようとしています。以下のコードでは、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))
}
ログイン後にコピー

解決策: TeeReader

同じ io.Reader から複数回読み取るには、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))
}
ログイン後にコピー

例:

上の例では、まず、以下を読み取る TeeReader を作成します。元のリーダーとバッファから。次に、TeeReader とバッファーから読み取り、同じコンテンツを 2 回取得します。

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

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