You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用http.Get后读取响应体为何仍出现资源泄漏?

为什么这段Go代码会触发资源泄漏,以及修复方法

问题原因

你虽然用了defer res.Body.Close()关闭响应体,但泄漏的根源在默认HTTP客户端的连接池机制:
Go的net/http包默认启用HTTP连接复用(Keep-Alive),对应的Transport组件会启动后台goroutine来管理闲置连接。这些goroutine不会在请求结束后立即退出,而是会等待约1分钟的闲置超时后才会被清理。goleak的VerifyNone会把这些未即时退出的后台goroutine判定为资源泄漏。

补充:如果响应体未被完全读取,Close()只会将连接放入闲置池而非立即关闭,但你这里用ioutil.ReadAll已经完整读取了响应体,所以核心问题还是连接池的后台goroutine。

修复方案

方案1:使用禁用连接复用的自定义客户端

创建一个关闭Keep-Alive的HTTP客户端,请求结束后连接会立即关闭,不会残留后台goroutine。可以修改业务函数支持传入自定义客户端:

// 修改getRespBody,支持传入自定义客户端
func getRespBody(client *http.Client, link string) (string, error) {
    res, err := client.Get(link)
    if err != nil {
        return "", err
    }
    defer res.Body.Close()
    resBody, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return "", err
    }
    return string(resBody), nil
}

// 测试代码
func TestRespBody(t *testing.T) {
    defer goleak.VerifyNone(t)
    // 创建禁用连接复用的客户端
    client := &http.Client{
        Transport: &http.Transport{
            DisableKeepAlives: true,
        },
    }
    _, err := getRespBody(client, "https://google.com")
    if err != nil {
        t.Fatal(err)
    }
}

方案2:测试结束后主动关闭闲置连接

如果不想修改业务函数,可以在测试末尾主动关闭默认客户端的闲置连接,强制清理连接池:

func TestRespBody(t *testing.T) {
    defer goleak.VerifyNone(t)
    _, err := getRespBody("https://google.com")
    if err != nil {
        t.Fatal(err)
    }
    // 关闭默认Transport的所有闲置连接
    if tr, ok := http.DefaultClient.Transport.(*http.Transport); ok {
        tr.CloseIdleConnections()
    }
}

方案3:让goleak忽略HTTP连接池的goroutine

如果需要保留连接复用特性,可以配置goleak忽略连接池相关的后台goroutine,但这种方式依赖具体的goroutine函数名,可能随Go版本变化失效:

func TestRespBody(t *testing.T) {
    defer goleak.VerifyNone(t,
        goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"),
        goleak.IgnoreTopFunction("net/http.(*persistConn).readLoop"),
    )
    _, err := getRespBody("https://google.com")
    if err != nil {
        t.Fatal(err)
    }
}

内容的提问来源于stack exchange,提问作者cert_perf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:18:41