结论:基线组合:go vet(官方,编译级可靠检查)+ staticcheck(社区标准,检查面广得多)+ gofmt/goimports(格式)+ golangci-lint(聚合器,统一跑多个 linter)。vet 与 staticcheck 分工:vet 只收录"几乎零误报、确定是 bug"的检查,保证可信;staticcheck 覆盖 bug(SA 系列)、性能(S 系列)、风格简化(ST/QF 系列),量更大、偶有需人工判断的提示。

展开:vet 抓什么:printf 参数不匹配、unreachable 代码、copylocks(复制锁)、循环变量捕获、原子操作误用、结构体 tag 拼错——都是"编译通过但必错"的问题,go test 默认已带一小子集。staticcheck 增量价值:未使用的代码(U1000)、defer 里忽略错误、低效写法(S1011 用 copy 替代循环拷贝)、context 误用、废弃 API 提醒。CI 落地建议:1)golangci-lint run 一条命令聚合,配置 .golangci.yml 明确启用的 linter 集,避免维护者膨胀 linter 数量导致噪音淹没真问题;2)gofmt -l / goimports -d 校验格式,不一致即失败;3)go mod tidy -check(或 tidy 后 git diff)保证依赖文件干净;4)race 测试 go test -race ./... 至少夜间跑。易错点:linter 报错全量修不如配置基线(new-from-rev),老代码存量问题逐步消化。

go vet ./...
staticcheck ./...
golangci-lint run ./...
test -z "$(gofmt -l .)"

追问方向:自定义分析器(analysis 框架)的写法、revive 与 golint 的更替历史。