GoLand 不支持自定义代码审查过滤器,仅能通过 golangci-lint 配置语义检查(如 errcheck)和 Structural Search 编写模板匹配特定模式(如 if err != nil 未 return)。

GoLand 本身不支持“自定义代码审查过滤器”这个概念——它没有像 TODO 过滤器那样提供 UI 界面让你定义“只标出未处理 error 的 if err != nil 分支”这类逻辑。你真正能配置的,是 linter 规则、结构化搜索模板、以及 File Watchers 的触发条件。
为什么搜不到“代码审查过滤器”设置项
GoLand 的 Settings → Editor → Inspections 里只有预置的检查项(如 Unused parameter、Shadowing variable),它们由内置分析引擎或集成的 golangci-lint 提供,不能用正则或 Groovy 脚本动态定义新规则。所谓“过滤”,实际发生在两个层面:
- 静态检查层:靠
golangci-lint的 rule 配置(如启用errcheck检查未处理错误) - 手动定位层:靠
Structural Search写模板匹配特定模式(如查找所有if err != nil { ... }但没调用return或panic的块)
用 Structural Search 定义可复用的“审查模式”
这是最接近“自定义过滤”的能力:不是实时报错,但能一键高亮/替换可疑代码段。
- 打开
Edit → Find → Search Structurally(快捷键Ctrl+Shift+Alt+Home) - 选 Go → Statements →
ifstatement 模板,然后编辑变量修饰符:
– 给$condition$加文本约束:err != nil或正则err\s*!=\s*nil
– 给$then$加脚本约束:!containsText($then$, "return") && !containsText($then$, "panic") - 保存为模板(如
if-err-no-return),后续在任意项目中点击Find就能扫出所有匹配块
注意:脚本约束里的 containsText 是 Groovy 函数,大小写敏感;若要匹配 os.Exit 或 log.Fatal,得扩展判断逻辑。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
通过 golangci-lint 启用语义级审查规则
真正影响代码质量的“审查”,必须走 golangci-lint。GoLand 只负责把它的输出渲染成波浪线,规则本身在 .golangci.yml 里定义:
- 必须启用
errcheck:它专抓os.Open、http.Get等返回 error 却未检查的调用 - 慎用
revive的deep-exit规则:它会标记所有没显式退出的if err != nil分支,但可能误报 defer 中的 error 处理 - 禁用
gosimple的S1005(建议用strings.ReplaceAll):这类风格建议会淹没真正危险的nil解引用告警
关键点:GoLand 的 Settings → Tools → Go Linter 里勾选 Run on the fly 后,这些规则才实时生效;如果只配了 CLI 命令却没开这个选项,编辑器里看不到任何提示。
别混淆 TODO 过滤器和代码审查
很多人在 Settings → TODO 里加了 BUG、FIXME 模式,就以为实现了审查。其实它只是文本扫描,对 // BUG: this panics when input is empty 这种注释高亮,但完全不分析上下文是否真会 panic。真正的审查依赖 AST 解析,只能靠 linter 或 Structural Search。
最容易被忽略的是:Structural Search 模板一旦保存,会默认作用于整个项目;如果你只想查 handlers/ 目录下的 HTTP handler,必须在搜索对话框里手动把 Scope 切成对应目录——否则可能扫出 vendor/ 里第三方库的匹配项,干扰判断。

















