我已经看过几个例子,你从那里读r.Body
,然后r.Body.Close()
马上做一个延迟。如果我们不关闭它会发生什么?
假设我有一个http.Handler
,在里面我像这样解码 r.Body 的内容:
func createFeedback(w http.ResponseWriter, r *http.Request) {
// ... Some code ...
f := feedback.New()
if err := json.NewDecoder(r.Body).Decode(f); err != nil {
return err
}
defer r.Body.Close()
// ... Some more code ...
}
Run Code Online (Sandbox Code Playgroud)
为什么我们要关闭r.Body
?
小智 1
这样做是为了防止连接资源泄漏。go官方文档中有这样一句话:
https://pkg.go.dev/net/http#Client
如果正文未读取到 EOF 并关闭,则客户端的底层 RoundTripper(通常为 Transport)可能无法重新使用与服务器的持久 TCP 连接来进行后续的“保持活动”请求。