回答

收藏

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

本版积分规则