golangci-lint不生效的根本原因是.golangci.yml未被正确加载——必须满足三个条件:配置文件与go.mod同级、IDE工作目录为项目根、显式传参--config=.golangci.yml;否则默认仅启用govet和errcheck,staticcheck等关键检查器全被关闭。

golangci-lint 不生效?先确认配置文件是否被正确加载
很多用户执行 golangci-lint run 没报错,但 IDE 里完全不标红——根本不是工具没装,而是 .golangci.yml 根本没被读到。它默认只启用 govet 和 errcheck,其余关键检查器(staticcheck、unused、revive)全关着。
必须满足三个条件,IDE 才会真正用上你的规则:
-
.golangci.yml文件得放在go.mod所在目录(不是src/下,也不是父级 monorepo 根目录) - GoLand 启动时的工作目录必须是含
go.mod的项目根目录(否则解析 module path 错,配置路径也错) - File Watcher 或插件设置中显式传参
--config=.golangci.yml;不加这个参数,它就当没这回事
File Watcher 配置要点:别直接选预设模板
GoLand 的「预设模板」里的 golangci-lint 监听器往往不带 --config 参数,也不设 --no-config 防干扰,结果就是跑了个寂寞。
手动新建一个 Custom File Watcher,关键字段填成这样:
-
Name:
golangci-lint-save -
File type:
Go -
Scope:
Project Files(或按需限定) -
Program:
golangci-lint(确保 PATH 可达,或填绝对路径) -
Arguments:
run --config=$ProjectFileDir$/.golangci.yml --no-config --timeout=60s --fast --issues-exit-code=0 $FilePathRelativeToProjectRoot$ - Output paths to refresh: 留空(linter 不输出文件)
注意:--issues-exit-code=0 是为了让保存不因警告中断;--fast 避免每次保存都扫全项目;--timeout 防止卡死。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
IDE 插件调用失败?检查三处硬性依赖
即使 File Watcher 跑通,插件侧仍可能静默失效。验证方式很直接:打开一个含未使用变量的 .go 文件,在终端执行:
golangci-lint run --config=.golangci.yml --no-config ./path/to/file.go
如果终端能报 SA4006 或 U1000,但 GoLand 编辑器里不标红,问题一定出在这三处:
- 插件设置里是否勾选了「Use config file」且路径填的是
.golangci.yml(不是空值、相对路径或./.golangci.yml) - GoLand 启动时当前工作目录是否为项目根(右下角状态栏看
Project: xxx是否对应go.mod位置) - 插件调用的
golangci-lint版本是否 ≥v1.52.0(旧版对revive规则支持不全,部分告警压根不触发)
保存即检查 ≠ 实时反馈,别指望它替代手动 run
File Watcher 是基于文件保存触发的单文件检查,它不会跨文件推导(比如未导出函数在别处被调用),也不会做 module 级引用分析。所以:
- 它适合快速捕获局部问题:未使用变量、弃用 API 调用、明显死循环
- 但不能替代 CI 中的
golangci-lint run ./...全量扫描 - 若你启用了
unused,它可能把刚写一半、尚未调用的函数标为“未使用”——这是正常现象,别因此关掉它
最易被忽略的一点:多 module 项目中,每个 module 都要单独放一份 .golangci.yml。父目录的配置不会向下继承,File Watcher 也不会自动向上查找。

















