golangci-lint 是什么
golangci-lint 是 Go 生态最常用的检查聚合器:把 errcheck、govet、ineffassign、staticcheck、unused 等多个 linter 收进一次运行,并行执行并统一输出,省去为每个工具单独写一套流水线的麻烦。默认启用的集合会随版本变化,配置写在仓库根目录的 .golangci.yml。
基本信息
| 定位 | linter 聚合与并行执行 |
|---|---|
| 默认组 | errcheck、govet、ineffassign、staticcheck、unused 等 |
| 配置文件 | 仓库根目录 .golangci.yml |
| 运行方式 | 本地命令与 CI 步骤共用同一份配置 |
典型使用场景
- 新项目起步:先用默认组跑绿,再按需开启更多 linter
- 统一团队工具链:本地与 CI 使用同一个二进制版本和配置
- 存量代码逐步收紧:按目录或按 linter 分批启用
- 提交前快速检查:只跑改动的包,缩短反馈时间
- 大仓库优化:并发控制与结果缓存让单次运行保持可接受
常用命令
常用命令
golangci-lint run ./... # 全量检查
golangci-lint run ./pkg/order/... # 只检查改动的包,反馈更快
golangci-lint run --fix ./... # 部分问题可自动修复
golangci-lint linters # 查看当前版本启用了哪些 linter
golangci-lint cache clean # 结果异常时清缓存重跑常用配置项
| 配置项 | 作用 | 注意事项 |
|---|---|---|
| linters.enable | 在默认组之外追加检查 | 新增检查先在小范围试跑,确认噪声可控 |
| linters.disable | 关闭某个检查 | 关闭前写清理由,避免连带削弱错误处理检查 |
| issues.exclude-rules | 按路径或文本排除 | 生成代码与测试夹具常用,范围别写得过宽 |
| run.timeout | 单次运行超时 | 大仓库需要适当放宽,否则中途被中断 |
把版本锁进依赖或工具清单:不同版本的默认 linter 与判定行为有差异,本地与 CI 不一致就会得到互相矛盾的结果。
本地只跑改动的包可以提速,CI 仍应跑全量:局部结果无法保证未改动的代码依然干净。
用 disable 关掉抱怨多的检查:errcheck 这类检查一关,未处理的错误就没人再发现了。