【问题标题】:Do I need to close Response body of http request even if I don't read it? [duplicate]即使我没有阅读它,我是否需要关闭 http 请求的响应正文? [复制]
【发布时间】: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 连接,或者导致不关闭它,这是资源泄漏并可能导致客户端资源耗尽。

标签: go go-http


【解决方案1】:

http.Head()DefaultClient.Head() 的包装器,它发出 Client.Do() 哪些文件:

如果返回的错误为 nil,则 Response 将包含一个非 nil 正文,预计用户将关闭该正文。如果 Body 没有被读取到 EOF 并被关闭,则客户端的底层 RoundTripper(通常是 Transport)可能无法重新使用与服务器的持久 TCP 连接来进行后续的“keep-alive”请求。

这应该足够你关闭它了。

即使您使用的是 HTTP HEAD 方法,这也只是对服务器的“建议”。不符合 RFC 的服务器可能会返回一个正文,即使它不应该(对于 HEAD 请求),Go 的 net/http 库可以通过 Response.Body 提供该正文。所以你应该关闭它。即使没有人向您发送或呈现任何尸体,关闭它也不会造成任何伤害。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多