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

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

request.Body(type io.ReadCloser)画像が入っているものを使いたいです。

ioutil.ReadAll()この本体をファイルに直接書き込んでデコードしたいので、使用したくないので、コンテンツへの参照のみを使用して、以降の関数呼び出しに渡します。

以下に示す例のように、リーダーの複数のインスタンスを作成してみました。

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))

}

しかし、2 回目の呼び出しでは常に になりますnil

同じリーダーに対して複数の個別の参照を渡す方法を教えてください。

ベストアンサー1

io.Readerストリームのように扱われます。このため、2 回読み取ることはできません。着信 TCP 接続を想像してください。着信したものを巻き戻すことはできません。

しかし、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)) 
}

遊び場に行く

編集:@mrclx が指摘したように、最初から読み取る必要がありますTeeReader。そうしないと、バッファが空になります。

おすすめ記事