在收到回复后推迟body.close

cli*_*ong -4 go

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

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

jul*_*enc 18

引用http包的官方文档:

完成后,客户端必须关闭响应正文


Siy*_*lav 6

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()
Run Code Online (Sandbox Code Playgroud)

来自 http.Client 文档:

如果返回的错误为零,则响应将包含一个非零的正文,用户应关闭该正文。如果正文未读取到 EOF 并关闭,则客户端的底层 RoundTripper(通常为 Transport)可能无法重新使用与服务器的持久 TCP 连接来进行后续的“保持活动”请求。

请求正文如果非零,将被底层传输关闭,即使出现错误也是如此。

什么是往返?

它是一个 Transport,指定发出单个 HTTP 请求的机制。如果为 nil,则使用 DefaultTransport。


eli*_*eve 5

与最高投票的答案相反:是的,必要关闭resp.Body 你是否消费它.

这是一个很好的问题,文档在这里非常误导.在Go官方论坛的这个主题中,诊断和结论 - 我自己经历过 - 是:

我导致在服务器上泄漏打开的文件,所以我确认,你必须关闭身体,即使你不读它

  • 如果有人对你说,"当你完成卫生间,洗手时,"这是否意味着你是否应该洗手,无论你是否使用过卫生间?我想不是. (12认同)
  • 这根本不是误导.如果"你不打算阅读它",那么你"完成它"并且必须关闭它. (2认同)