【发布时间】:2022-01-06 18:30:48
【问题描述】:
我有以下代码:
resp, err = http.Head("http:something.com")
if err != nil {
//do something
}
if resp.StatusCode == http.StatusOK {
// do something
}
由于我没有阅读resp 的正文,我假设我不需要像resp.Body.Close() 那样关闭它。我的假设是正确的,还是应该打电话给resp.Body.Close()?
【问题讨论】:
-
无论是否阅读,都应该关闭正文。
-
你觉得合上身体会痛吗?文档指出“关闭 Body 是调用者的责任。”您认为这不适用于您的情况吗?您如何证明您不需要仅仅因为不阅读正文而关闭正文的假设是正确的?
-
使用 Go 标准库(以及遵循相同的良好设计的第 3 方代码)的经验法则是
Close您的代码处理的任何内容:这仅仅是因为 Go 的类型不能具有析构函数并实现显式方法来释放这些类型的实例所持有的内存以外的资源。在您的特定情况下,未能关闭响应主体可能(并且通常会)阻止正确重用底层 TCP 连接,或者导致不关闭它,这是资源泄漏并可能导致客户端资源耗尽。