golangci-lint的“严格模式”指启用errcheck、staticcheck、govet、unused等高价值linter,禁用golint、dupl等噪声项,并配置skip-dirs、timeout、tests: true及精细化linters-settings以提升检出精度与可靠性。

什么是 golangci-lint 的“严格模式”
它不是官方术语,而是开发者对一组高敏感度、低容忍度检查策略的统称:启用更多 linter、关闭默认忽略项、收紧阈值、不跳过生成代码或测试文件。本质是把 unused、errcheck、staticcheck 这类容易报错但价值高的检查推到前台,同时压制低信噪比规则(如 lll 行长限制)。
启用关键 linter 并禁用噪声项
默认配置会启用约 10 个 linter,但其中 golint 已弃用,dupl(重复代码)在小项目里误报率高,goconst 对字符串常量过于激进——这些该主动关掉。
- 必须启用:
errcheck(强制处理 error)、staticcheck(SA 系列语义分析)、govet(标准 vet 检查)、unused(未使用标识符) - 建议禁用:
golint、dupl、goconst、lll - 注意:
typecheck和deadcode通常由go build覆盖,CI 中可关,本地调试时再开
调整 linters-settings 提升检出精度
光开 linter 不够,得调参数。比如 gocyclo 默认阈值是 10,但真正影响可维护性的圈复杂度往往从 15 开始;funlen 若不限制函数行数,staticcheck 就很难发现隐藏的逻辑膨胀。
-
gocyclo:min-complexity: 15 -
funlen:lines: 60(比默认 100 更严) -
gocritic: 启用"rangeValCopy"和"unlambda",这两条能揪出易被忽略的性能和可读性问题 -
govet: 设enable-all: true,再单独disable: ["fieldalignment"](后者在跨平台构建时干扰大)
运行时参数与路径控制决定是否真“严格”
很多团队配完以为严格了,结果 CI 总失败——其实是 skip-dirs 漏了 generated,或者 timeout 太短导致 staticcheck 在 vendor 里没跑完就中断。
立即学习“go语言免费学习笔记(深入)”;
-
skip-dirs必须包含:- vendor、- generated、- mocks(否则 protobuf 或 mockgen 代码狂报错) -
timeout建议设为3m以上,尤其含大量第三方依赖时 -
tests: true—— 测试文件也要过errcheck和unused,别让 test/ 目录成质量洼地 -
issues-exit-code: 1是底线,CI 中必须设,否则 lint 失败不阻断合入
真正的严格不在于开了多少 linter,而在于每条规则都经过权衡:哪些该报错、哪些该忽略、哪些只在 CI 触发、哪些允许 //nolint 临时绕过。越早明确这些边界,越不容易在 PR 评审时陷入“这个 warning 算不算 bug”的争论。


















