在 .golangci.yml 中禁用某个 linter,直接在 linters 块中使用 disable 列出名字即可,但注意 enable 和 disable 不能共存,否则配置加载失败;推荐仅用 enable 显式声明所需 linter。

怎么在 .golangci.yml 中禁用某个 linter
直接在 linters 块里用 disable 列出名字即可,但注意:enable 和 disable 不能同时存在——否则配置加载失败,golangci-lint 会报错退出。
推荐只用 enable 显式声明,避免继承默认启用集带来的意外行为。比如你只想保留基础检查:
linters:
enable:
- govet
- errcheck
- staticcheck
这样其他 linter(如 gosimple、unused)天然不生效,比写一堆 disable 更清晰可控。
staticcheck 和 gosimple 能否共存?
可以,但不建议。两者功能高度重叠(都检查代码逻辑合理性),同时启用会导致大量重复告警,比如同样一个类型断言未检查错误,staticcheck 和 gosimple 都可能报。
实操建议:
- 新项目优先只开
staticcheck:它更活跃、更新快,对泛型和 Go 1.22+ 支持更好 - 若团队已习惯
gosimple的提示风格,可关掉staticcheck,只留gosimple - 两者都开时,务必在
issues中设max-issues-per-linter: 5,防止刷屏掩盖真正问题
只想关掉某 linter 的个别规则,比如 errcheck 不检查 _ = xxx()
这是「禁用规则」的常见误解:linter 本身是开关粒度,但部分 linter 支持内部子规则配置。比如 errcheck 就能控制是否报告空白赋值:
linters-settings:
errcheck:
check-blank: false
这意味着 _ = fmt.Println("ok") 不再被标记——但 errcheck 整体仍启用,其他错误(如 os.Open 返回值未检查)照常报警。
类似地,govet 可以单独禁用某子检查:
linters-settings:
govet:
disable:
- "fieldalignment"
这类细粒度控制必须查对应 linter 的文档,不是所有 linter 都支持。
临时跳过某行 / 某函数的检查
用 //nolint 注释最灵活,但要注意语法细节:
-
//nolint:跳过当前行所有 linter -
//nolint:errcheck:仅跳过errcheck对当前行的检查 -
//nolint:errcheck,govet:跳过多 linter,逗号分隔,**不可有空格** - 放在函数声明上方时,作用于整个函数体;放在行尾时,只作用于该行
别滥用——它绕过了配置文件管控,容易在代码演进中被遗忘。真要长期关闭某处检查,优先考虑调整 linters-settings 或重构代码。
最易被忽略的一点:不同 Go 版本下,同一 linter 的规则覆盖范围可能变化(比如 staticcheck 在 Go 1.21 和 1.22 对泛型方法调用的检查严格度不同),所以禁用规则前,先确认它是版本兼容的“真冗余”,而不是“暂时没适配新语法”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











