Avatar ·

如果不关闭Go中的response.Body会发生什么?内存泄漏及其他问题

大家好!我刚开始学习Go,正在编写一个简单的HTTP客户端来从API获取数据。我有这样的代码: ```go resp, err := http.Get("https://api.example.com/data") if err != nil { log.Fatal(err) } // 我没有关闭 resp.Body data, _ := io.ReadAll(resp.Body) fmt.Println(string(data)) ``` 一切正常,数据也收到了。但我注意到在Stack Overflow和Go文档的许多示例中,都写了 `defer resp.Body.Close()`。老实说,我不明白为什么需要这样做,如果程序在读取数据后立即结束?如果我忘记关闭 `response.Body`,会发生什么坏事?内存泄漏?程序变慢?还是对于小脚本来说根本不重要?请用通俗的语言解释一下底层发生了什么。提前感谢! <<>>

为什么关闭response.Body至关重要

您说得对,在短脚本中这可能不会显现,但在实际应用程序(Web服务器、长期运行的守护进程)中,忽略关闭会导致连接无法复用,进而引发资源耗尽和内存泄漏。Go的HTTP客户端默认使用连接池,不关闭Body会使连接保持打开状态,最终导致程序性能下降甚至崩溃。