该配置是开箱即用的“最稳”方案:启用govet、errcheck、staticcheck、unused、gosimple、ineffassign六个核心linter,禁用golint/typecheck/lll等易误报项,设timeout=2m、skip-dirs含vendor等目录,并配置max-issues-per-linter:0与github-actions输出格式,确保CI有效识别问题。

直接用这个配置就能跑,不用改就能覆盖 90% 的基础问题。 它不是“最小配置”,而是“最稳开箱配置”:不启用冷门 linter,不依赖 fix 能力,不设激进阈值,避免 CI 突然失败或本地误报干扰。
为什么不用默认配置?
golangci-lint 默认会启用约 20+ 个 linter,其中 lll(行长检查)、goconst(重复字面量)、dupl(代码重复)等在多数项目里要么误报高,要么维护成本大。更关键的是:默认不设 timeout 和 skip-dirs,大型项目一跑就卡死或扫到 vendor/ 报一堆无关错误。
-
govet、errcheck、staticcheck、unused这四个是核心必选,覆盖空指针、错误未处理、过时 API、变量未使用等高频风险 -
gosimple和ineffassign加进来只增不减质量,且基本不误报 - 显式禁用
golint(已废弃)、typecheck(go build已覆盖)、lll(格式应由gofumpt或编辑器统一管)
.golangci.yml 极简模板(复制即用)
放在项目根目录,文件名必须是 .golangci.yml(注意开头的点):
run:
timeout: 2m
skip-dirs:
- vendor
- testdata
- mocks
- generated
<p>linters:
enable:</p><ul><li>govet</li><li>errcheck</li><li>staticcheck</li><li>unused</li><li>gosimple</li><li>ineffassign
disable:</li><li>golint</li><li>typecheck</li><li>lll</li></ul><p>issues:
max-issues-per-linter: 0
max-same-issues: 0说明:max-issues-per-linter: 0 表示不限制单个 linter 的报错数,CI 中必须设这个,否则 staticcheck 扫出 51 条就截断;max-same-issues: 0 关闭合并,确保每条问题独立可见。
立即学习“go语言免费学习笔记(深入)”;
第一次运行前要确认的三件事
这个配置能跑起来,但容易卡在环境细节上:
- 确保
golangci-lint版本 ≥ v1.53.0 —— 旧版本(如 v1.40.x)对 Go 1.21+ 模块行为支持不全,modules-download-mode: readonly会失效 - 不要在子目录下执行
golangci-lint run,它默认从当前目录向上找.golangci.yml,但skip-dirs路径是相对于项目根的,子目录运行会导致跳过失效 - 如果项目用了
//go:build标签,需加build-tags到run下,否则govet可能漏检条件编译分支里的问题
输出格式别忘了配,否则 CI 看不见问题
本地终端看没问题,但集成到 GitHub Actions 或 GitLab CI 时,必须显式指定机器可读格式:
在 .golangci.yml 末尾追加:
output:
formats:
- format: github-actions
path: stdout或者用命令行临时覆盖:golangci-lint run --out-format=github-actions。不配这个,CI 日志里只有彩色文字,GitHub 不会自动标注 PR 中的问题行——这是最常被忽略的“配置完成了但没生效”的原因。


















