1. ホーム
  2. go

[解決済み] response.Bodyを閉じないとどうなりますか?

2022-07-12 18:57:47

質問

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
}

エラーが発生した場合はどうすればよいのでしょうか。 resp または resp.Body はゼロなのか?

どのように解決するのですか?

<ブロッククオート

この場合、メモリリークが発生するのでしょうか?

これはリソースリークです。接続は再使用されず、ファイル記述子が解放されない場合は、開いたままにすることができます。

また、レスポンスオブジェクトを取得した直後に 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 ではない Body が含まれ、ユーザはこれを閉じる必要があります。BodyがEOFまで読まれ、閉じられていない場合、クライアントの基礎となるRoundTripper(通常はトランスポート)は、その後の"keep-alive"要求のためにサーバーへの持続的なTCP接続を再利用できない可能性があります。