一尘不染

如果我不关闭 response.Body 会发生什么?

go

在 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
}

如果有错误,可能respresp.Body为零怎么办?


阅读 343

收藏
2021-11-19

共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,则 Response 将包含一个非 nil Body,用户应该关闭它。如果 Body 没有被读取到 EOF 并被关闭,则客户端的底层 RoundTripper(通常是 Transport)可能无法为后续的“保持活动”请求重新使用到服务器的持久 TCP 连接。

2021-11-19