golangci-lint需显式启用bodyclose检查器并配置handled_functions或// handled注释,才能检测resp.body未关闭问题,避免连接复用污染和文件描述符泄漏。

你需要让 golangci-lint 检查 HTTP 响应体是否被正确关闭,避免连接复用污染和文件描述符泄漏,尤其在封装了 HTTP 客户端的项目中必须明确标注已处理响应体的函数。
启用 bodyclose 检查器
在 .golangci.yml 中的 linters-settings 下添加 bodyclose 配置块:
linters-settings:
bodyclose:
这一步必须做,否则即使启用了 bodyclose linter,它也不会运行任何检查逻辑。
bodyclose 默认处于禁用状态,不显式声明配置即等同于未启用。
配置 handled 指令白名单
bodyclose 会跳过对已标注 handled 的函数调用的检查,标注方式是在函数文档注释中添加 // handled。
方法一:为单个函数添加 handled 注释
在你已确保完整读取并关闭 resp.Body 的公共请求函数上方,写一行注释:
// handled
注意:该注释必须紧贴函数声明上方,且不能带任何前导空格或额外字符,否则 golangci-lint 无法识别。
方法二:全局指定 handled 函数名列表
在 .golangci.yml 的 bodyclose 配置下添加 handled_functions 字段:
bodyclose:
handled_functions:
- DoRequest
- CallAPI
- FetchData
列出所有你项目中已内部处理 resp.Body 的封装函数名。这些函数调用点将不再触发 bodyclose 报错。
验证 bodyclose 是否生效
第一步:在代码中故意写出未关闭 resp.Body 的典型错误模式
resp, err := http.Get("https://example.com")
if err != nil {
return err
}
body, _ := io.ReadAll(resp.Body)
// ❌ 忘记 resp.Body.Close()
第二步:运行检查命令
golangci-lint run
第三步:确认输出中出现类似提示
bodyclose: response body must be closed 【resp.Body.Close() missing】
若无此提示,说明配置未生效或该代码未被扫描路径覆盖。检查 .golangci.yml 中的 runs 和 issues 部分是否排除了当前目录。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











