staticcheck不报SA1019是因为它默认被golangci-lint禁用,必须在.golangci.yml中显式启用staticcheck并设置checks: ["all"],否则即使安装最新版、配置文件存在且路径正确,SA1019等关键检查仍不会触发。

为什么 staticcheck 不报 SA1019(调用已弃用 API)
不是代码没用 deprecated 标记,而是 staticcheck 默认根本没启用——它被 golangci-lint 默认禁用,哪怕你装了最新版、写了 .golangci.yml,只要没显式打开,SA1019 就永远不会出现。
-
golangci-lint的默认配置里staticcheck是关着的,只开govet和errcheck等基础项 - GoLand 里即使路径填对、插件启用,若没勾选
staticcheck或没加载配置文件,编辑器也不会标红 - CI 中跑
golangci-lint run若没传--config=.golangci.yml,也会退回到无staticcheck的默认集
必须在 .golangci.yml 中显式启用 staticcheck 并开全检查
仅写 enable: [staticcheck] 还不够:默认情况下它只运行子集,SA1019 属于 “弃用警告” 类别,需手动激活 checks: ["all"]。
- 确保
.golangci.yml与go.mod同级,文件名严格为.golangci.yml(不是.yaml,不带 BOM) - 在
linters.enable下包含staticcheck,且不能被disable列表覆盖 - 必须添加
linters-settings.staticcheck.checks: ["all"],否则 SA1019、SA1021 等关键检查仍被跳过 - 示例最小有效片段:
linters:
enable:
- govet
- errcheck
- staticcheck
- unused
linters-settings:
staticcheck:
checks: ["all"]
屏蔽特定废弃 API 调用(而非全局关掉 SA1019)
真要忽略某次调用(比如兼容旧版 SDK),优先用 //nolint:staticcheck 行内注释,而不是关整个检查器——后者会让所有弃用风险漏检。
- 注释必须紧贴代码行末尾,无空格、无换行:
foo.Bar() //nolint:staticcheck - 可指定更细粒度规则:
foo.Bar() //nolint:SA1019(注意大小写和前缀) - 不支持在
import行或函数体外使用;想忽略整个函数,把注释放在函数声明行末尾 - 别用
//nolintlint:staticcheck——那是给原生staticcheck命令用的,golangci-lint完全不识别
容易被忽略的环境一致性陷阱
本地不报 SA1019,但 CI 突然爆满,大概率是环境没对齐:IDE、本地 CLI、CI 流水线三者用的不是同一份配置或同一套 linter 版本。
- GoLand 必须勾选
Use configuration并填对.golangci.yml绝对路径,否则只跑 IDE 自带规则 - 本地 CLI 运行时加
--config=.golangci.yml,不要依赖自动发现 - CI 脚本中显式指定
golangci-lint run --config=.golangci.yml --issues-exit-code=1,避免静默跳过 -
golangci-lint2.15+ 对staticcheck的 AST 解析更严格,若 Go 版本低于 1.21,可能因泛型解析失败导致 SA1019 不触发
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











