一尘不染

如果我不回应,身体会怎样?

go

在Go中,我有一些http响应,有时我忘了打电话:

resp.Body.Close()

在这种情况下会发生什么?会有内存泄漏吗?defer resp.Body.Close()获取响应对象后立即放入是否安全?

client := http.DefaultClient
resp, err := client.Do(req)
defer resp.Body.Close()
if err != nil {
    return nil, err
}

如果有错误,可能resp还是resp.Body无效怎么办?


阅读 244

收藏
2020-07-02

共1个答案

一尘不染

在这种情况下会发生什么?会有内存泄漏吗?

这是资源泄漏。该连接不会被重用,并且可以保持打开状态,在这种情况下,文件描述符将不会被释放。

获取响应对象后立即放入defer resp.Body.Close()是否安全?

否,请按照文档中提供的示例操作,并在检查错误后立即将其关闭。

client := http.DefaultClient
resp, err := client.Do(req)
if err != nil {
    return nil, err
}
defer resp.Body.Close()

http.Client文档中:

如果返回的错误为nil,则响应将包含一个非零的Body,希望用户将其关闭。如果未同时将Body读取到EOF并关闭,则客户端的基础RoundTripper(通常为Transport)可能无法将与服务器的持久TCP连接重新用于后续的“保持活动”请求。

2020-07-02