golangci-lint是当前Go项目唯一应配置的静态检查主入口,必须手动启用staticcheck、goconst等关键linter并严格使用.golangci.yml配置文件(位置在go.mod同级、仅空格缩进),禁用已归档的golint。

别用 golint,它已归档、不支持泛型、不报关键问题;golangci-lint 是当前唯一应配置的主入口,但默认配置几乎等于没配——必须手动启用 staticcheck、goconst 等真正有用的 linter,否则 CI 报错而本地安静退出,纯属配置失效。
配置文件名和位置必须严格匹配
执行 golangci-lint run 没输出,90% 是因为配置没被加载。它只认一个名字:.golangci.yml(不是 .golangci.yaml,也不是 golangci.yml)。而且必须放在 go.mod 所在目录——monorepo 里每个 module 各自一份,不能放 Git 根目录。
- 缩进只能用空格,Tab 会导致解析失败,静默跳过整个配置
-
linters-settings和run是顶层字段,写成linters.linters-settings就完全无效 - CI 脚本里别依赖自动发现,显式传参:
golangci-lint run --config=.golangci.yml
默认启用的 linter 基本没用,必须手动开关键检查器
golangci-lint 默认只开约 10 个基础 linter(如 govet、errcheck),像 staticcheck 这种能捕获 time.Now().Unix() > 0 这类恒真判断的,默认是关的。电商/支付项目里重复出现 17 次的 "404" 字面量,goconst 才能揪出来。
- 在
.golangci.yml中加linters.enable列表:- staticcheck、- goconst、- gosimple - 启用
staticcheck全规则:linters-settings.staticcheck.enable-all: true - 禁用
golint:linters.disable: ["golint"],它和revive规则重叠、误报率高
CI 和本地行为不一致?先查环境三件套
CI 报一堆 SA1019(弃用 API)而本地安静,基本不是代码问题,是环境漂移。
-
GO111MODULE:CI 默认可能为off,导致go list -deps解析失败,报package xxx is not in GOROOT -
GOROOT/GOPATH:CI 镜像中路径可能与本地不同,影响插件查找和缓存 - Go 版本差异:Go 1.21+ 的泛型深度分析,旧版
golangci-lint(如 v1.42.x)根本无法处理,必须升到 v1.54+(2026 年主流版本)
新手别一上来就配 golangci-lint
它不是学习工具,是质量守门员。刚写完 fmt.Println("hello") 就被 unused、errcheck、staticcheck 狂轰滥炸,会掩盖真正该练的语法和语义问题。
- IDE 内置检查更合适:VS Code 或 GoLand 开启
govet、Unused import、Shadowing of variable即可,实时、轻量、修复建议明确 - 等你能稳定写出可运行、有测试、模块清晰的代码后,再引入——比如团队开始出现重复的
io.ReadCloser忘记Close,才启用errcheck - 跳过
vendor和generated目录:它们含 protobuf 或 mock 生成代码,staticcheck在里面会报几百条无意义错误
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











