如果我不关闭 response.Body 会发生什么?
技术问答
274 人阅读
|
0 人回复
|
2023-09-12
|
在 Go 中,我有一些 http 响应,有时候忘记调用:. S+ s0 O3 A7 }
resp.Body.Close()( Q7 @7 w/ X! l# _9 J
在这种情况下会发生什么?会有内存泄漏吗?defer resp.Body.Close()获得响应对象后立即放入是否安全?
6 w0 q( u, X0 |! |2 |3 Bclient := http.DefaultClientresp,err := client.Do(req)defer resp.Body.Close()if err != nil return nil,err}9 U5 N" A8 {7 J, K; [0 Y
若有错误,可能resp或resp.Body为零怎么办?
8 |7 O4 R$ c6 } 8 R. K p5 o) Q/ { O5 @# w* u
解决方案: " M) [; Q4 M" v. P# B. p
在这种情况下会发生什么?会有内存泄漏吗?' ?1 s% r3 t, T6 |4 x
这是资源泄漏。在这种情况下,文件描述符不会发布,因为连接不会被重用,可以保持打开。
6 f# K/ c! U4 T获得响应对象后立即放入 defer resp.Body.Close() 安全吗?* i. @6 Y: x( T, `' [$ H
不,根据文档中提供的示例,检查错误后立即关闭。
/ v6 a3 J: p3 W* g( e' O4 C+ D% Nclient := http.DefaultClientresp,err := client.Do(req)if err != nil return nil,err}defer resp.Body.Close()" c, K# [1 r7 A; ~, |8 {- C
从http.Client文档:
s1 U6 N5 [( Z' ?. Q如果返回的错误是 nil,则 Response 将包含一个非 nil Body,用户应Body 没有读 EOF 并关闭,客户端底层 RoundTripper(通常是 Transport)可能无法要求后续的保持活动重用服务器持久 TCP 连接。 |
|
|
|
|
|