resp.Body.Close()是否必要,如果我们不从身体读取任何东西?

Ogu*_*gic 13 go

我有一个函数只是发出一个get请求来检查状态代码.它不会从身体上读取任何东西.我还应该结束这个功能resp.Body.Close()吗?

呼叫者在完成阅读后应该关闭resp.Body.如果resp.Body未关闭,则客户端的基础RoundTripper(通常为Transport)可能无法重新使用到服务器的持久TCP连接以用于后续"保持活动"请求.

and*_*olm 21

是.当您调用http.Get时,只要读取了所有HTTP标头,该函数就会返回响应.尚未阅读回复的正文.Response.Body是与服务器的网络连接的包装器.当您从中读取时,它会下载响应的正文.

.Close()告诉系统您已完成网络连接.如果您尚未读取响应正文,则默认的http传输将关闭连接.(如果正在读取正文,则传输只能重新使用连接,因为如果它重用与未读主体的连接,则使用该连接发出的下一个请求将收到先前请求的响应!)

因此,如果您正在进行多个请求,那么阅读Body通常比简单的Close()更有效 - 特别是对于创建相对昂贵的TLS连接.

如果您不需要响应的主体,则应使用Head而不是Get.头部不需要读取关闭响应体.

  • @Roylee,这是关于所有请求都发送到同一服务器的情况(例如,https://golang.org和https://golang.org/doc/)。如果响应主体没有完全关闭,则每个请求将在单独的TCP连接上发送,并且两个连接都不会关闭。如果没有阅读就关闭了主体,则每个请求都会拨号并关闭其自己的TCP连接。但是,如果您阅读并关闭正文,则第二个请求可能会在与第一个请求相同的连接上发送,从而节省了第二个连接上用于TCP和TLS握手的时间。 (2认同)