golangci-lint 是上线前必须卡住的质量门槛,需正确配置 PATH、手动编写 golangci.yml(启用 errcheck/staticcheck/govet,禁用已归档工具)、跳过测试目录、设置超时与退出码,并在 CI/pre-commit 中严格校验。

直接装 golangci-lint,别碰 golint 或单个 linter;它不是“锦上添花”,而是上线前必须卡住的质量门槛。
安装 golangci-lint 时 PATH 没配对就根本跑不起来
常见错误现象:command not found: golangci-lint —— 不是没装成功,是装进 $GOPATH/bin 后 shell 找不到。
- 先确认路径:
go env GOPATH,通常为$HOME/go,所以二进制在$HOME/go/bin - macOS(zsh)用户:检查
~/.zshrc是否有export PATH="$GOPATH/bin:$PATH",改完要source ~/.zshrc - Linux 或 Windows:确保该路径已加入系统
PATH环境变量,然后新开终端验证:golangci-lint --version - 别用
go install装:它会拉 module、污染本地 Go 环境,且版本难锁定
.golangci.yml 必须手动写,init 生成的默认配置漏掉关键问题
运行 golangci-lint init 生成的配置默认只启用保守检查器(比如只开 govet),errcheck 和 staticcheck 都不激活 —— 这意味着空指针、goroutine 泄漏、未处理 error 全部放过。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 最小可用配置里至少启用:
errcheck(捕获被忽略的error)、staticcheck(查死代码、循环中time.After滥用等 SA 级隐患)、govet(基础语义检查) - 显式禁用已归档工具:
disable: ["golint", "maligned", "scopelint"]——golint官方 2021 年就归档了,规则主观、噪音大 - 跳过测试相关目录:
skip-dirs: ["testdata", "mocks", "vendor"],否则sql.Rows在 mock 场景下会被误报资源未关闭 - 加超时保护:
run: timeout: 2m,避免大型项目卡死
CI 和 pre-commit 里不加 --issues-exit-code=1 就等于没设门禁
很多团队把 golangci-lint run 塞进 CI,但没设退出码,结果检查出一堆 unused 或 errcheck 错误,流水线仍绿色通过 —— 问题照常合入主干。
立即学习“go语言免费学习笔记(深入)”;
- CI 中必须加:
golangci-lint run --issues-exit-code=1 --out-format=github-actions(GitHub Actions 适配) - pre-commit 钩子里建议加
--fix(仅限支持自动修复的 linter,如gofumpt),但 CI 里慎用,避免格式化冲突 - 本地开发建议绑定到保存动作:VS Code 中设
"go.lintTool": "golangci-lint",配合"go.lintOnSave": "package",问题实时浮现 - 别让
unused刷屏盖住真正高危项(如SA1019调用弃用 API),靠staticcheck的 SA 规则集守住底线
最易被忽略的一点:staticcheck 默认不启用,哪怕你写了 enable: ["staticcheck"],也得确认它实际生效 —— 运行 golangci-lint run --debug 看输出里有没有 staticcheck 的执行日志。没日志,就是配置没加载对。

















