在收到回复后推迟body.close

时间:2014-05-29 08:30:30

标签: go

......
resp, err := httplib.Get(url)
if err != nil {
    fmt.Println(err)
}
defer resp.Body.Close()
......

是否有必要每次关闭响应机构?

3 个答案:

答案 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。