Golang 小技巧:正确关闭 Response.Body 复用 HTTP 连接

举报
Ray999 发表于 2026/09/27 08:42:18 2026/09/27
【摘要】 在 Go 中发送 HTTP 请求后,通常都会写:resp, err := http.Get("https://example.com")if err != nil { return err}defer resp.Body.Close()但只调用 Close(),在某些场景下并不一定能让底层连接顺利复用。如果响应内容不需要使用,可以先把 Body 读取完:resp, err := http.G...

在 Go 中发送 HTTP 请求后,通常都会写:

resp, err := http.Get("https://example.com")
if err != nil {
	return err
}
defer resp.Body.Close()

但只调用 Close(),在某些场景下并不一定能让底层连接顺利复用。

如果响应内容不需要使用,可以先把 Body 读取完:

resp, err := http.Get("https://example.com")
if err != nil {
	return err
}
defer resp.Body.Close()

_, _ = io.Copy(io.Discard, resp.Body)

io.Discard 相当于一个“黑洞”,写进去的数据会直接被丢弃。

这样做的好处是可以把响应体消费完,让 HTTP Transport 更有机会复用已有连接。

如果本来就需要读取响应内容:

body, err := io.ReadAll(resp.Body)
if err != nil {
	return err
}

fmt.Println(string(body))

那么响应体已经被正常读取,就不需要再额外复制到 io.Discard。

小结

使用 Go HTTP Client 时,不要忘记:

defer resp.Body.Close()

对于不需要响应内容的请求,还可以考虑消费掉剩余 Body:

_, _ = io.Copy(io.Discard, resp.Body)

在大量 HTTP 请求、连接池复用、微服务调用等场景中,这是一个值得注意的小细节。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。