回答

收藏

如果我不关闭 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 B
    client := 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% N
    client := 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 连接。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则