こんなコードがあるとする。
...
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())
おしまい。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント