Golang 小技巧:正确关闭 Response.Body 复用 HTTP 连接
【摘要】 在 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)