在 Go 中,我有一些 http 响应,有时我忘记调用:
resp.Body.Close()
在这种情况下会发生什么?会不会有内存泄漏?defer 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为零怎么办?
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文档:
http.Client
如果返回的错误为 nil,则 Response 将包含一个非 nil Body,用户应该关闭它。如果 Body 没有被读取到 EOF 并被关闭,则客户端的底层 RoundTripper(通常是 Transport)可能无法为后续的“保持活动”请求重新使用到服务器的持久 TCP 连接。