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 になったりしたらどうなるでしょうresp
かresp.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 接続を再利用できない可能性があります。