golangci-lint run慢的主因是默认扫描vendor等无关目录、未启用稳定缓存、误开高开销linter(如typecheck)或模块解析本身低效;应跳过vendor/testdata、固定GOLANGCI_LINT_CACHE路径、禁用golint/deadcode、保留govet/errcheck/staticcheck/unused核心四项。

golangci-lint run 为什么慢?先看真实瓶颈在哪
不是所有“慢”都该优化——真正拖慢的是 vendor 扫描、重复解析、未启用缓存,或误开了高开销 linter。默认情况下,golangci-lint run 会递归检查全部目录(含 vendor/、testdata/、examples/),且每次启动都重新加载所有包信息。如果你的项目有大量第三方依赖或嵌套模块,这一步就可能耗时几十秒。
跳过无关目录和文件:最直接有效的提速手段
90% 的慢,源于检查了不该检查的东西。用 --skip-dirs 和 --skip-files 粗粒度过滤,比在配置里 disable linter 更快:
golangci-lint run --skip-dirs vendor,testdata,examples,scripts- 加
--skip-files ".*_test\.go"可跳过测试文件(仅限你确认测试逻辑不参与 lint 规则验证时) - 注意路径分隔符:Linux/macOS 用英文逗号分隔,Windows 命令行需改用分号(但建议统一用 WSL 或 CI 环境避免)
- 别依赖
.gitignore自动跳过——golangci-lint默认不读它,除非显式加--exclude-use-default=false并配run.skip-dirs-use-default: true
启用缓存并固定缓存路径:CI 和本地都要做
缓存失效是 CI 中“偶发变慢”的主因。关键不是开不开缓存,而是缓存路径是否稳定、是否跨 job 复用:
- 本地开发:确保
GOLANGCI_LINT_CACHE指向一个固定路径,例如$HOME/.cache/golangci-lint - CI 场景(GitHub Actions / GitLab CI):必须挂载缓存卷,并设环境变量:
GOLANGCI_LINT_CACHE: /tmp/golangci-cache,再配合actions/cache或cache:paths持久化该路径 - 禁用
--fast模式用于 CI 主流程:它会跳过unused、staticcheck等重量级 linter,导致漏检;只应在 pre-commit hook 里用 - 检查缓存是否生效:加
-v参数运行一次,观察日志中是否有cache hit或loaded from cache
精简启用的 linter 列表:避免功能重叠与冗余分析
默认启用约 20+ linter,但很多检查目标高度重合(比如 staticcheck 和 gosimple 都覆盖代码简化建议),同时开启不仅不增益,反而增加解析负担:
- 优先保留核心四项:
govet、errcheck、staticcheck、unused—— 它们覆盖类型安全、错误处理、静态缺陷、资源浪费等高频问题 - 明确禁用已归档或低价值项:
golint已于 2021 年归档,deadcode功能被unused全面替代 - 慎用
typecheck:它等价于go list -e -json全量解析,对大模块项目极易成为性能瓶颈;若go build ./本身已很慢,typecheck几乎必然拖累 lint - 配置示例(
.golangci.yml)中应只出现enable:或只出现disable:,二者共存会导致行为不可预测
真正卡住的往往不是某条规则本身,而是模块解析阶段反复加载 go.mod 和 vendor 包。如果 go list ./... 在你的项目里已经要跑 5 秒以上,那再怎么调 golangci-lint 参数也难突破瓶颈——这时候该看的是模块结构,而不是 lint 配置。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











