在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,则响应将包含一个非零的Body,希望用户将其关闭。如果未同时将Body读取到EOF并关闭,则客户端的基础RoundTripper(通常为Transport)可能无法将与服务器的持久TCP连接重新用于后续的“保持活动”请求。