レスポンス本文を閉じないとどうなるでしょうか? 質問する

レスポンス本文を閉じないとどうなるでしょうか? 質問する

Go では、いくつかの http 応答があり、呼び出すことを忘れることがあります。

resp.Body.Close()

defer resp.Body.Close()この場合、何が起こりますか? メモリ リークは発生しますか? また、応答オブジェクトを取得した直後に挿入しても安全ですか?

client := http.DefaultClient
resp, err := client.Do(req)
defer resp.Body.Close()
if err != nil {
    return nil, err
}

エラーがあったり、nil になったりしたらどうなるでしょうrespresp.Body?

ベストアンサー1

この場合、何が起こりますか? メモリリークは発生しますか?

これはリソース リークです。接続は再利用されず、開いたままになる可能性があり、その場合、ファイル記述子は解放されません。

また、応答オブジェクトを取得した直後に defer resp.Body.Close() を挿入しても安全でしょうか?

いいえ、ドキュメントで提供されている例に従い、エラーを確認した後すぐに閉じてください。

client := http.DefaultClient
resp, err := client.Do(req)
if err != nil {
    return nil, err
}
defer resp.Body.Close()

ドキュメントよりhttp.Client:

返されたエラーが nil の場合、レスポンスにはユーザーが閉じることが期待される nil 以外のボディが含まれます。ボディが EOF まで読み込まれず、閉じられていない場合、クライアントの基盤となる RoundTripper (通常はトランスポート) は、後続の「キープアライブ」要求に対してサーバーへの永続的な TCP 接続を再利用できない可能性があります。

おすすめ記事