只启用 staticcheck 需用 golangci-lint run --enable=staticcheck 或更稳妥的 --disable-all --enable=staticcheck;但仅启用它不等于启用其全部子规则(如 SA4006),须通过配置文件设置 staticcheck.enable-all: true 或指定 checks 列表。

golangci-lint run 怎么只启用 staticcheck?
默认情况下 golangci-lint run 只启用约 10 个基础检查器(如 govet、errcheck),像 staticcheck 这类强规则检查器是默认关闭的。想只跑它一个,不能靠“禁用其他”,而要显式控制启用列表。
- 最直接的方式:用
--enable参数指定,例如golangci-lint run --enable=staticcheck - 注意:这会完全忽略配置文件里的
linters.enable和linters.disable,命令行参数优先级最高 - 如果同时传了
--disable-all,它会清空所有默认启用项,再叠加--enable,所以golangci-lint run --disable-all --enable=staticcheck更稳妥 - 不推荐用
--disable列出全部其他检查器来“反向筛选”——易漏、难维护、版本升级后容易失效
为什么 --enable=staticcheck 后还是没报 time.Now().Unix() > 0 这类问题?
staticcheck 默认只开部分子规则;恒真/恒假判断(如 SA4006)属于“额外启用项”,需要配置 linters-settings.staticcheck.enable-all: true 或手动开启对应检查项。
- 仅命令行启用
staticcheck不等于启用它的全部能力 - 若项目有
.golangci.yml,建议在里面加:linters-settings: staticcheck: enable-all: true - 或者更精细地只开需要的:
linters-settings: staticcheck: checks: ["SA4006", "SA4029"] - 没有配置文件时,命令行无法设置
staticcheck的内部checks列表,必须配文件
如何确认当前实际运行的是哪个检查器?
别信配置文件里写了什么,要看最终生效了哪些。两个命令比对最可靠:
- 查默认启用项:
golangci-lint help linters—— 显示带[default]标记的检查器 - 查当前配置下实际启用项:
golangci-lint linters(注意不是help linters)—— 它读取配置并输出真实启用列表 - 如果
golangci-lint linters输出里没有staticcheck,说明配置没加载或被禁用,和run命令是否加--enable无关 - 配置文件名必须是
.golangci.yml(不是.yaml或无点前缀),且必须放在go.mod所在目录
CI 脚本里只跑 single linter 容易踩的坑
CI 中常见写法 golangci-lint run --enable=staticcheck ./... 看似简洁,但有几个隐性风险:
-
./...是 shell 展开,不同系统行为不一致;应统一用./...(三个点)或./+--fast控制范围 - 未指定
--config时,CI 环境可能因工作目录或 GOPATH 差异找不到配置,导致staticcheck实际没加载任何子规则 - 某些 CI 镜像自带旧版 golangci-lint(如 v1.x),不支持
--enable参数,会静默失败 - 建议显式锁版本并指定配置:
golangci-lint run --config=.golangci.yml --enable=staticcheck --timeout=5m ./
配置和命令行参数的耦合比看起来深得多,尤其当你要依赖某个检查器的特定子规则时,光让名字出现在启用列表里远远不够。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











