staticcheck 在 golangci-lint 中默认关闭,需在项目根目录与 go.mod 同级的 .golangci.yml 中显式启用,并配置 skip-dirs 和 timeout 避免误报与超时。

staticcheck 在 golangci-lint 中默认是关闭的
装完 golangci-lint 直接跑 golangci-lint run,staticcheck 不会自动启用——它不在默认启用列表里。你看到的 SA 系列告警(比如 SA1019 调用弃用函数、SA4006 死循环)根本不会出现,除非你显式把它加进配置。
.golangci.yml 必须和 go.mod 同级且文件名严格为 .yml
把配置写成 .golangci.yaml、放在 config/ 子目录、或丢在 src/ 里,golangci-lint 都会静默忽略。它只认项目根目录下、与 go.mod 并列的 .golangci.yml。
- 多 module 项目(如 monorepo)中,每个 module 的
go.mod所在目录都得放一份独立的.golangci.yml - CI 中必须显式指定路径:
golangci-lint run --config=.golangci.yml,否则可能读到空配置或父目录残留 - VS Code 的 Go 插件也要手动勾选「使用配置」并填对路径,否则沿用缓存规则
只启用 staticcheck,别混用 gosimple 或 unused
staticcheck 本身已覆盖 gosimple 全部能力,二者共存只会重复报错;unused 则容易在测试或 mock 场景中误报(比如 _ = sql.Rows.Close() 被判未使用),建议先禁用,等代码稳定再评估是否开启。
推荐最小有效配置片段:
linters-settings:
staticcheck:
checks: ["all"] # 开全量检查,包括 SA 和 ST 系列
disable-all: true
enable:
- govet
- errcheck
- staticcheck
- bodyclose
- sqlclosecheck
注意:disable-all: true 和 enable 必须共存,不能只写 disable 列表——否则 staticcheck 仍不会生效。
跳过 generated 和 testdata 目录,避免误报刷屏
staticcheck 对 protobuf 生成代码、mock 文件、测试数据极易误报(比如 ST1005 错误消息首字母小写、SA1019 误标 generated 函数弃用)。不跳过会导致 CI 失败或开发者习惯性忽略警告。
- 在
.golangci.yml中加:skip-dirs: ["vendor", "generated", "testdata", "_test"] - 或更精准地用
issues.exclude-rules过滤特定文件:- path: ".*_gen\.go" -
run.timeout建议设为2m,否则含大量 generated 代码时容易超时退出
真正卡住质量的不是规则数量,而是能否让关键问题(比如资源未释放、弃用 API、死循环)在第一次提交时就浮出水面——这要求配置既精准又克制,而不是堆砌 linter。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











