golangci-lint需正确配置才能生效:必须使用名为.golangci.yml的配置文件,与go.mod同级;多module项目需每个module单独配置;运行时须显式指定--config=.golangci.yml;推荐启用govet、errcheck、staticcheck、unused、revive五个核心linter。

golangci-lint 不是装完就能用的工具——它默认只启用 govet、errcheck 等寥寥几个 linter,staticcheck、unused、goconst 这些真正能揪出 bug 的检查器全被关着。没配 .golangci.yml,等于没用。
配置文件必须叫 .golangci.yml,且放在 go.mod 所在目录
常见错误:文件名写成 .golangci.yaml、golangci.yml(缺点)、.golangci.yml.bak;或扔在项目根目录但 go.mod 其实藏在 src/ 里。golangci-lint 只认严格匹配的 .golangci.yml,且必须和 go.mod 同级。多 module 项目(如 monorepo)中,每个 module 都要单独放一份,父目录的配置不会继承。
golangci-lint run 不自动读配置,CI 里尤其容易失效
本地命令行直接 golangci-lint run 会尝试找配置,但 CI 容器环境常因路径、工作目录或缓存问题漏读。最稳妥的做法是显式传参:golangci-lint run --config=.golangci.yml。VS Code 或 GoLand 也一样:IDE 设置里必须勾选「使用配置」并填对路径,否则插件可能沿用旧缓存或内置默认规则。
必开的 5 个 linter:govet、errcheck、staticcheck、unused、revive
这些不是“建议”,而是实际项目中暴露问题最多、误报率可控的核心组合:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
govet:Go 官方静态检查,基础安全兜底 -
errcheck:强制处理error返回值,避免静默失败 -
staticcheck:深度语义分析,报SA1019(弃用 API)、SA4006(死循环)等真实风险 -
unused:发现未使用的变量、函数、import,清理技术债务 -
revive:替代已弃用的golint,支持自定义规则,比如禁止_ = xxx形式忽略 error
别碰 dupl(重复代码检测)和 lll(行长限制)——前者阈值难调、易误报,后者纯属风格偏好,不该卡 CI。
CI 中跑不起来?先砍并发、加超时、跳耗时 linter
GitHub Actions 或 GitLab CI 里 golangci-lint 卡住、OOM 或报 context deadline exceeded,基本就是资源没控住:
- 加
--concurrency=2:CI 通常只有 2 vCPU,不设会争抢资源 - 加
--timeout=2m:防止单次分析无限 hang 住整条流水线 - 加
--fast:跳过goconst、gocyclo等耗时 linter,保留核心五项即可 - 缓存
~/.cache/golangci-lint:否则每次重编译 linter,启动就慢半分钟
注意:--fast 在 IDE 里也要开,否则编辑器会卡顿;但开发机本地全量检查仍建议去掉该 flag,定期跑一次深度扫描。
golangci-lint 的复杂点不在语法,而在它和 Go module、Git 工作区、IDE 缓存三者之间的耦合。一个 .golangci.yml 放错位置,或 CI 命令漏了 --config,整个检查就形同虚设。真正落地时,盯住路径、显式传参、精简启用项,比堆砌配置更重要。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










