必须用golangci-lint并配置.golangci.yml启用unused、errcheck、staticcheck、govet、revive这5个核心linter,其中unused查未使用标识符,errcheck捕获忽略error,staticcheck报弃用api和死循环,govet检查类型不匹配等底层错误,revive替代已归档golint。

GoLand 里没有“全局静态代码”这个概念,它不提供按“静态性”(比如是否带 static 关键字)搜索的功能——Go 语言本身就没有 static 关键字。你真正想找的,通常是:项目中所有未被调用的函数、方法、变量,或者所有被 go vet/golangci-lint 标记为潜在问题的代码位置。
查未使用函数/变量:用 unused linter 而不是“全局搜索”
很多人误以为在 Ctrl+Shift+F(在文件中查找)里搜 func 或 var 就能定位死代码,其实完全无效——这只会匹配字面量,无法理解调用关系。
-
unused是 golangci-lint 内置的 linter,专用于检测未被引用的标识符,包括包级变量、常量、函数、方法(含导出项,前提是配置了-all或启用unused的全模式) - 必须先在项目根目录配好
.golangci.yml,显式启用:linters-settings: unused: check-exported: true - 直接运行
golangci-lint run,结果会精确到行号;GoLand 的 “Problems” 工具窗口也会实时显示,点击即可跳转 - 注意:
unused不报接口实现方法,除非该类型从未被实例化或赋值给接口变量;若用了var _ Interface = MyType{}这类空声明,它会认为“已被使用”,需手动清理
查未处理 error:别依赖搜索,靠 errcheck 实时标记
搜 error 或 if err != nil 同样不可靠:可能漏掉嵌套调用、被提前 return 掩盖、或写成 _, err := foo() 却没检查。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
errcheck是唯一能系统识别“调用返回 error 但未处理”的工具,它分析 AST 而非字符串 - 确保
.golangci.yml中启用了:linters: - errcheck
- GoLand 设置里要勾选 “Use configuration file”,路径指向你的
.golangci.yml,否则 IDE 会退回到默认保守子集,errcheck不生效 - 常见漏报场景:调用链中间某层用了
errors.Wrap(err, ...)但上层仍忽略;errcheck能穿透包装,但要求所有相关模块都在同一go.mod下解析
查 go vet 类问题:必须进命令行补一手 go vet -all
GoLand 的静态分析面板默认只跑部分 govet 检查项,像 shadowing(变量遮蔽)、unmarshal(json 解析传非指针)等关键项默认关闭。
- 在终端进项目根目录,执行:
go vet -all ./(Go 1.21+ 支持-all;旧版本需列具体项,如-printf -atomic -bools) - 如果输出
no buildable Go source files,说明当前不在go.mod目录,或GO111MODULE=off——go vet严格依赖模块解析 - GoLand 的 “Go | 静态分析器” 设置里,
govet的checks字段必须设为["all"],且勾选 “Use configuration file”,否则 IDE 界面里的提示和命令行结果不一致 - 典型误判:
fmt.Printf("%s", 42)会被报错,但log.Printf("%s", 42)不会——go vet只内置检查fmt包的格式串,其他日志库需靠staticcheck补充
最易被忽略的一点:所有这些检查都依赖 go.mod 的完整性。如果 golangci-lint run 报 cannot find module providing package,不是配置错了,而是你的 import 路径在本地根本 resolve 不出来——先 go mod tidy,再运行检查,否则一切静态分析都是空中楼阁。










