我有一个函数,它只是发出一个 get 请求来检查状态代码。它不会从身体中读取任何内容。我还应该用 结束函数resp.Body.Close()
吗?
调用者在完成读取后应关闭 resp.Body。如果 resp.Body 没有关闭,客户端的底层 RoundTripper(通常是 Transport)可能无法重新使用到服务器的持久 TCP 连接来进行后续的“keep-alive”请求。
我有一个函数,它只是发出一个 get 请求来检查状态代码。它不会从身体中读取任何内容。我还应该用 结束函数resp.Body.Close()
吗?
调用者在完成读取后应关闭 resp.Body。如果 resp.Body 没有关闭,客户端的底层 RoundTripper(通常是 Transport)可能无法重新使用到服务器的持久 TCP 连接来进行后续的“keep-alive”请求。
是的。当您调用 http.Get 时,该函数会在读取所有 HTTP 标头后立即返回响应。尚未阅读响应的正文。Response.Body 是与服务器的网络连接的包装器。当您从中读取时,它会下载响应的正文。
.Close() 告诉系统您已完成网络连接。如果您尚未阅读响应正文,默认的 http 传输将关闭连接。(如果主体已被读取,传输只能重用连接,因为如果它重用与未读主体的连接,则使用该连接发出的下一个请求将收到前一个请求的响应!)
因此,如果您发出多个请求,则读取正文通常比简单的 Close()ing更有效——尤其是使用创建成本相对较高的 TLS 连接。
如果您不需要响应的正文,则应使用 Head 而不是 Get。Head 不需要读取或关闭响应正文。