GoLand本身不提供“未检查代码”机制,需组合go vet、golangci-lint(启用errcheck/staticcheck/unused并禁用golint)、Coverage面板和deadcode工具协同定位。

GoLand 本身不提供“未检查代码”这个概念——它没有内置的“待审查标记”或“需人工复查区域”机制。所谓“未检查”,通常指开发者自己定义的、尚未被静态检查、测试覆盖或人工走查的代码。要定位这类代码,得靠组合策略,而不是点一个按钮。
用 go vet 扫出基础可疑代码
go vet 是最轻量但最关键的起点,它不依赖配置、不报风格问题,只揪“合法但极可能错”的硬伤:
- 结构体字段小写却带
json:"x"标签 → 实际序列化时被忽略 -
fmt.Printf("%s", 42)这类类型不匹配 → 运行时报 panic,但编译通过 -
sync.WaitGroup传值(wg.Add(1))而非传址 → 并发逻辑静默失效
在终端运行:go vet ./...;在 GoLand 中右键项目 → Run go vet(需启用 Settings | Tools | Go Tools 中的 vet 集成)。注意:它不会报告未处理 error 或死代码,那是其他工具的事。
用 golangci-lint 补全语义级问题
单靠 go vet 远不够。golangci-lint 是实际项目中唯一值得投入的聚合检查器,但它默认只开保守子集,必须手动激活关键规则:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 加
errcheck→ 捕获所有未处理的error返回值(比如os.Remove("x")后没判 err) - 开
staticcheck→ 查弃用 API(如syscall.Exec)、无用 return、重复赋值 - 启
unused→ 找未被调用的导出/未导出函数和变量(注意:它对反射、测试、接口实现无感知) - 禁用
golint→ 官方已归档,规则主观、噪音大,2026 年起社区普遍弃用
配置必须放在项目根目录的 .golangci.yml 中,否则 golangci-lint run 会报 “no Go files in directory”。CI 中若用 GO111MODULE=off 或 vendor 模式,staticcheck 会直接失败——它强依赖模块上下文。
用 Coverage 面板反向定位“零覆盖”函数
测试覆盖率不是质量指标,但它是“未检查代码”最可靠的代理信号。GoLand 的 Coverage 面板能直接告诉你哪些函数一行都没跑过:
- 右键 Coverage 面板 → Show Covered Lines Only → 编辑器只剩绿色行,所有红色/灰色折叠,缺口一目了然
- 按
Coverage %列降序排列,找 0% 的 handler 或 service 方法,重点检查测试是否真发出了 HTTP 请求(httptest.NewRecorder()+router.ServeHTTP()),而非只调用函数内部某行 - 注意:init() 里调用的函数、包级变量初始化中使用的函数,即使没显式调用,也可能被覆盖统计误认为“已执行”
用 deadcode 专扫私有死函数
Go 编译器对未导出函数极其宽容——func helper() 即使完全没人调用,也不会警告、不会删。这时 deadcode 是唯一靠谱的工具:
- 安装:
go install github.com/tsenart/deadcode@latest - 运行:
deadcode ./...→ 输出类似pkg/util.go:12:6:unused func cleanupTempFiles - 它基于调用图做前向可达性分析,但无法识别
reflect.Value.Call、plugin.Open或 JSON 配置驱动的调用,这类必须人工 review - 警惕误报:函数被
var _ = helper引用、或作为接口方法集一部分(var _ io.Closer = &MyStruct{}),deadcode会漏掉或错报
真正麻烦的从来不是工具找不出代码,而是你删掉一个看似无用的 init() 函数后,整个包的注册逻辑就断了——这种隐式契约,工具永远没法替你判断。

















