......
resp, err := httplib.Get(url)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
......
是否有必要每次关闭响应机构?
答案 0 :(得分:17)
引用http package的官方文档:
客户端在完成后必须关闭响应正文
答案 1 :(得分:5)
与最高投票的答案相反:是的, 必须关闭resp.Body
,无论您是否使用。
这是一个很好的问题,文档在这里非常误导。在官方Go论坛的this thread中,我自己经历的诊断和结论是:
我导致在服务器上泄漏打开的文件,所以我确认,你必须关闭身体,即使你不读它
答案 2 :(得分:1)
What happens if we do not close the response body ?
这是资源泄漏。它可以保持打开状态,并且客户端连接不会打开 重用。
建议检查错误后立即关闭。
client := http.DefaultClient
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
从http.Client文档中:
如果返回的错误为nil,则响应将包含非nil的主体 希望用户关闭。如果身体不是两个都读 终止并关闭客户的基础RoundTripper(通常是 传输)可能无法重新使用持久的TCP连接来 服务器进行后续的“保持活动”请求。
请求主体(如果非零)将被基础对象关闭 运输,即使出错也可以。
什么是RoundTripper?
它是一种传输,它指定个人使用的机制 发出HTTP请求。如果为nil,则使用DefaultTransport。