Find Usages仅查找显式调用,无法识别反射、接口绑定、字符串注册等隐式调用;真正检测废弃函数需结合deadcode -all命令与人工验证。

用 Find Usages 查单个函数的调用处,但不等于“废弃函数”检测
GoLand 本身没有“废弃函数”概念——它不自动标记哪些函数该被删。所谓“废弃”,实际是人判断的结果:比如你刚改完逻辑,旧函数没删;或同事留了未注册的 handler;或 deadcode 报出的未使用函数。此时你想知道“这函数到底还在不在用”,Find Usages 是最直接手段:Alt+F7(Win/Linux)或 Option+F7(macOS),光标停在函数名上即可。但注意:Find Usages 只找显式调用,对以下情况完全失效:
- 反射调用,如
reflect.ValueOf(obj).MethodByName("OldFunc") - 接口空声明,如
var _ SomeInterface = &OldStruct{}(会让工具误以为类型被消费) - 通过字符串注册的 handler(如 Gin 的
router.GET("/old", "old_handler"),且没做静态绑定) - 跨 module 的调用(若当前项目未
go mod edit -replace指向本地路径,GoLand 可能无法索引到调用方)
deadcode -all 才是真·废弃函数扫描器,不是 GoLand 功能
GoLand 不内置死代码分析。真正能批量揪出“项目里定义了但从没被任何路径执行过”的函数,得靠命令行工具 deadcode。它和 GoLand 无关,但结果可导入人工验证:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 必须加
-all参数,否则默认跳过所有首字母大写的导出函数(func Exported()) - 务必在 module 根目录运行:
deadcode -all ./...,否则跨包调用链会断 - 慎用
-vendor:vendor 目录里的代码不是你维护的,扫进去只会干扰判断 - 输出是纯文本路径+行号,例如:
main.go:12:6: goodbye,可复制进 GoLand 快速跳转
把 deadcode 结果当“待查函数列表”,再用 GoLand 逐个确认
拿到 deadcode 输出后,别急着删。很多“未使用”是假象,得靠 GoLand 辅助验证:
- 对每个疑似废弃函数,在 GoLand 里
Ctrl+Click进入定义,看是否有var _ Interface = &Type{}类型绑定——搜var _.*=.*+ 函数所属类型名 - 检查是否被 pprof 或 debug 接口间接触发(比如
/debug/pprof/heap调用的 dump 函数,虽无业务调用但不能删) - 用
Call Hierarchy(Ctrl+Alt+H)展开调用链,看顶层是否只出现在测试文件(*_test.go)或已注释掉的路由注册里 - 如果函数名含
Deprecated或注释带// Deprecated:,右键选Find Usages时勾选Include comments,确认文档是否同步更新
别信“一键全删”,复杂点都在反射和框架注册里
真正难处理的废弃函数,往往藏在反射、插件系统或 Web 框架的字符串路由中。deadcode 看不见它们,Find Usages 也找不到显式引用。这时候必须人工交叉验证:查 init() 函数、搜 Register / Use / Add 等动词 + 函数名、翻框架文档确认注册机制。这些地方,GoLand 的搜索(Ctrl+Shift+F)比任何快捷键都管用——只是得你自己想好搜什么。

















