go vet 能直接发现 unreachable code,无需额外插件;GoLand 通过调用 go vet 实现编辑器内实时高亮,依赖正确配置的 GOPATH/GOPROXY 和 Go SDK,且需开启“Run go vet on save”选项。

go vet 能直接发现 unreachable code,不用额外插件
GoLand 本身不内置不可达分支检测逻辑,但会调用 go vet 做底层分析——只要项目配置了正确 GOPATH/GOPROXY 和 Go SDK,它就能在编辑器里实时标出 return true; return false 这类明显不可达语句。这不是 IDE 功能,而是 go vet 的控制流分析结果被 GoLand 解析后高亮显示。
手动触发 go vet 扫描整个模块的命令和时机
编辑器自动提示有时会延迟或漏掉跨文件路径(比如从 init 函数跳转到某私有函数末尾),这时必须主动运行:
- 终端执行
go vet ./...——注意是./...不是.,否则可能跳过子模块 - 若项目含 cgo 或 build tag,加
-tags=xxx参数确保和实际构建环境一致 - CI 中建议用
go vet -vettool=$(which staticcheck) ./...替代,因为staticcheck对不可达分支的覆盖更细(比如能识别if debug { panic() }后面的代码)
常见误报和真漏报场景要人工核对
go vet 只分析静态控制流,对以下情况无能为力:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 函数内含
runtime.Goexit()或os.Exit(0):后续语句会被标记为不可达,但这是有意为之,需加//nolint:unreachable - panic 被 recover 捕获:
defer func(){ if r := recover(); r != nil { ... } }()后的代码不会被判定为不可达,但实际可能永远不执行 - 条件编译块:
//go:build !prod下的代码若未启用对应 tag,go vet不会进入该分支,也就无法判断其内部是否不可达
GoLand 设置里别关掉 “Run go vet on save”
这个开关在 Settings > Tools > Go Tools 里,默认开启。关掉后编辑器不再实时提示,只能靠手动运行或 CI 拦截——而很多不可达分支在改逻辑时临时引入,等推送到 CI 才发现,修复成本已翻倍。它不拖慢保存速度,因为 go vet 是增量扫描,只检查变更文件及其直接依赖。
真正容易被忽略的是:当项目用了自定义 GOROOT 或多版本 Go 切换时,GoLand 可能仍用旧版 SDK 绑定的 go vet,导致某些新规则(如 Go 1.22+ 新增的 nilness 子检查)不生效。此时要进 Settings > Go > GOROOT 确认路径指向当前正在用的 Go 安装目录。

















