golangci-lint是Go生态唯一应安装配置的静态检查主入口,golint已归档禁用;它并行调度staticcheck、govet、errcheck等linter,统一管理配置与输出,而非手动运行独立工具。

golangci-lint 是当前 Go 项目实际可用的主流 lint 工具,golint 已被官方归档(deprecated),不再维护,也不再推荐用于新项目。
为什么 golint 不该再用
它早在 2022 年就被 Go 团队标记为 archived,源码仓库只读、无更新、不兼容 Go 1.21+ 的泛型深度分析。你运行 golint ./ 没报错,不代表代码没问题——它根本不会检查 type T[U any] 这类泛型声明的命名或约束问题。
-
golint默认只检查命名、注释、错误字符串格式等表层风格,对空循环、弃用 API(如SA1019)、重复字面量、未使用变量等关键问题完全无感知 - 它的输出无法自动修复,也不能和
go fmt或goimports协同工作 - VS Code、GoLand 等主流 IDE 已默认弃用
golint集成,改用golangci-lint或revive
golangci-lint run 为什么没输出?三处必查
常见现象:本地执行 golangci-lint run 安静退出,但 CI 报一堆 SA1019、GO1012 错误。这不是工具失效,是配置没生效。
- 配置文件名必须是
.golangci.yml(不是.golangci.yaml或golangci.yml) - 必须放在
go.mod所在目录(不是 Git 根目录,monorepo 中每个 module 各自一份) - 缩进只能用空格,不能用 Tab;
linters-settings和run是顶层字段,不是linters的子项 - CI 脚本中别依赖自动发现,显式传参:
golangci-lint run --config=.golangci.yml
启用真正有用的 linter:staticcheck、goconst、gosimple
golangci-lint 默认只启用约 10 个基础 linter(如 govet、errcheck),像 staticcheck 这种能捕获 time.Now().Unix() > 0 这类恒真判断的检查器,默认是关闭的。
立即学习“go语言免费学习笔记(深入)”;
- 必须在
.golangci.yml中显式启用:linters-settings.staticcheck.enable-all: true或至少加staticcheck到linters.enable列表 -
goconst对电商/支付类项目极有用:能揪出重复的 HTTP 状态码字面量(如"200"、"404"出现 17 次) -
gosimple不是帮你写三元运算符,而是把if x != nil { return x } else { return y }提示改为更地道的return x ?? y(实际建议写成if x != nil { return x }; return y) - 禁用
golint:它已过时,且与revive规则重叠、误报率高,配置里加linters.disable: ["golint"]
CI 中 golangci-lint 失败但本地正常?环境差异优先排查
CI 和本地行为不一致,90% 是环境配置漂移,不是代码问题。
-
GO111MODULE:CI 默认可能为off,导致go list -deps解析失败,报package xxx is not in GOROOT——统一设为on - Go 版本:
staticcheck在 Go 1.20 下对泛型支持不稳,可能 panic;CI 中固定版本,例如actions/setup-go@v6设为1.21.10 -
golangci-lint版本:别用latest,CI 安装命令必须带具体版本号,如v1.54.2;本地和 CI 版本不一致会导致规则开关行为不同
golangci-lint 的核心复杂点不在安装,而在配置落地——文件名、路径、缩进、版本、模块模式,四者缺一不可。漏掉任意一个,就等于没配。


















