staticcheck 默认禁用,必须在与go.mod同级的.golangci.yml中显式加入linters.enable列表,并在CI和IDE中通过--config=.golangci.yml或等效路径配置显式加载,否则不会触发SA类告警。

staticcheck 默认是关着的,不配就等于没开
golangci-lint 安装完后 staticcheck 默认处于禁用状态,哪怕你跑 golangci-lint run 也不会触发任何 SA 类告警(比如 SA1019 调用弃用 API、SA1021 循环里滥用 time.After)。这不是漏配,是设计如此——它把深度分析器都设为 opt-in,避免新手被大量警告淹没。
必须显式启用,且仅靠 IDE 勾选不够:GoLand 或 VS Code 里在 Settings → Static Analysis 表格中勾选 staticcheck,只在 IDE 本地生效;CI 或终端运行仍依赖配置文件。真正跨环境一致的方式,是写进项目根目录(与 go.mod 同级)的 .golangci.yml。
在 .golangci.yml 中正确启用 staticcheck
配置要同时满足两个条件:出现在 linters.enable 列表中,且不能被 disable-all: true 或全局 disable 拦截。
-
linters:下必须有enable:块,且包含- staticcheck - 不能出现
disable-all: true,否则整个enable列表失效 - 如果用了
presets(如- bugs),需确认该 preset 确实包含staticcheck;但建议直写enable,更可控 - 多 module 项目中,每个 module 的
go.mod目录下都得有独立的.golangci.yml,父目录配置不会继承
最小可用配置示例:
立即学习“go语言免费学习笔记(深入)”;
linters:
enable:
- staticcheck
- errcheck
- govetCI 和 IDE 都得显式加载配置文件
即使 .golangci.yml 写对了,不告诉工具“用这个文件”,它还是走默认规则。
- CI 中执行时,必须加
--config=.golangci.yml参数:golangci-lint run --config=.golangci.yml - GoLand 中需勾选 “Use configuration”,并在路径栏填入
.golangci.yml的绝对路径(不是相对路径,IDE 不支持) - VS Code 的 Go 插件也要在设置里指定
"go.lintFlags": ["--config=.golangci.yml"] - 忘记加参数或填错路径,会导致
staticcheck完全静默,连 warning 都不报
容易被忽略的兼容性细节
staticcheck 版本和 golangci-lint 主版本强绑定。截至 2026 年 11 月,golangci-lint v2.12.2 对应的 staticcheck 是 v2023.1.x 系列,若手动升级 staticcheck 二进制,可能因 API 变更导致 golangci-lint 启动失败或跳过检查。
- 不要单独
go install honnef.co/go/tools/cmd/staticcheck@latest,应统一通过golangci-lint自带版本使用 - 检查是否生效最直接的方式:在代码里故意写一个
time.Sleep(1)(SA1015),或调用已标记Deprecated的函数,看是否报SA1019 - 某些旧版
.golangci.yml里写了linters-settings: staticcheck: checks: ["all"],这在新版本已废弃,会静默忽略,删掉即可


















