2019-11-25に更新

手軽にGoのResponse.Bodyを再利用したいとき

こんなコードがあるとする。

...
response, _ := http.Get(requestURL)
body, _ := ioutil.ReadAll(response.Body)
body.Close()
...

GoのHTTP Responseをioutil.ReadAllなんかで読み込むと、response.Bodyのコンテンツをどこまで読み込んだかという情報を持つポインタ(Seeker)が最後まで進んでしまうので、もう1度response.Bodyを読み込もうと思っても何も読み込めない。なので、response.Bodyを別の場所にコピーしておく必要があるんだけど、適当にfoo = response.Bodyとかやってもダメ。

そんなときはio.TeeReaderを使って別の場所にコピーする(というかバッファを読み込むためのReaderをもう1つ用意する)。そうすれば新しいSeekerを使って読み込みを行えるので、response.Bodyの再利用が出来る。

var b bytes.Buffer
_ = io.TeeReader(response.Body, &b)
// こんな感じでコンテンツを読み込んでも後続の処理では引き続き`response.Body`を利用することが出来る。
log.Printf("DEBUG: %s", b.String())

おしまい。


shige

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント