为什么在检查完请求后必须关闭请求的主体?

Ale*_*lex 11 go

我已经看过几个例子,你从那里读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 连接来进行后续的“保持活动”请求。