如果我不关闭 response.Body 会发生什么?
技术问答
319 人阅读
|
0 人回复
|
2023-09-12
|
在 Go 中,我有一些 http 响应,有时候忘记调用:1 j7 u ^6 y4 a& @8 N. Y; i
resp.Body.Close()
7 Q( _0 W1 ~3 y3 z" e 在这种情况下会发生什么?会有内存泄漏吗?defer resp.Body.Close()获得响应对象后立即放入是否安全?+ D5 q. D" j9 G9 b" _
client := http.DefaultClientresp,err := client.Do(req)defer resp.Body.Close()if err != nil return nil,err}
; f* `% H" x& p4 t5 q6 j. a* ] 若有错误,可能resp或resp.Body为零怎么办?, }5 a' v3 d! f$ q& s! o
$ `7 m/ C0 n) F9 j+ x- S5 Z, P
解决方案: ( z% b1 Q6 a+ Z
在这种情况下会发生什么?会有内存泄漏吗?* \7 N( L8 v/ B6 `5 [
这是资源泄漏。在这种情况下,文件描述符不会发布,因为连接不会被重用,可以保持打开。6 b9 O5 m+ ^! J+ O" X
获得响应对象后立即放入 defer resp.Body.Close() 安全吗?1 ?: Q2 O4 b$ |1 y; W2 A! S
不,根据文档中提供的示例,检查错误后立即关闭。
! x8 R! e+ `+ ]3 ?! cclient := http.DefaultClientresp,err := client.Do(req)if err != nil return nil,err}defer resp.Body.Close() v# t e. T* i0 R) [: R$ A% J4 j
从http.Client文档:
6 I+ N; z. t; j% W4 l( X% u, S8 G如果返回的错误是 nil,则 Response 将包含一个非 nil Body,用户应Body 没有读 EOF 并关闭,客户端底层 RoundTripper(通常是 Transport)可能无法要求后续的保持活动重用服务器持久 TCP 连接。 |
|
|
|
|
|