小编dem*_*mee的帖子

Go HTTP 包:为什么读取完 res.Body 后需要关闭它?

请参阅此处的示例https://pkg.go.dev/net/http#example-Get。下面也有截图:

func main() {
    res, err := http.Get("http://www.google.com/robots.txt")
    if err != nil {
        log.Fatal(err)
    }
    body, err := io.ReadAll(res.Body)
    res.Body.Close() // Why!?
    if res.StatusCode > 299 {
        log.Fatalf("Response failed with status code: %d and\nbody: %s\n", res.StatusCode, body)
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", body)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我需要关闭res.Body.Close()第7行。我没有打开它。我在如果我不关闭response.Body会发生什么?中看到了解释。我明白文档是这么说的。

有没有更好的方法来解决这个问题?

我认为这违反了开闭原则。我认为如果 ReadAll 打开了 steam,它应该将其关闭。Go 中通常是这样完成这些事情的吗?

go

0
推荐指数
1
解决办法
2518
查看次数

标签 统计

go ×1