goland 不支持一键删除未使用函数,需借助 deadcode 工具扫描并人工核对隐式引用,再通过测试和符号表验证确保安全。

GoLand 本身不提供“一键删除未使用函数”功能
它能高亮、提示、重构,但不会自动删代码——尤其对未导出函数(小写首字母)几乎不干预。这是因为 Go 编译器也不管这些函数是否真被调用,只要语法可达就保留;IDE 遵循同样保守策略,避免误删反射、测试或接口实现依赖的函数。
用 deadcode 扫描定位,再手动删
deadcode 是目前最可靠的辅助工具,它基于调用图做前向分析,能找出本包内完全不可达的私有函数:
- 安装:
go install github.com/tsenart/deadcode@latest - 运行:
deadcode ./(当前模块)或deadcode ./pkg(指定子目录) - 输出示例:
pkg/util.go:12:6:unused func cleanupTempFiles,直接带行号
注意:deadcode 会漏掉 reflect.Value.Call、plugin.Open、JSON 配置驱动的调用,也对 var _ = helper 或空接口赋值(var _ io.Closer = &MyStruct{})敏感,可能误报,得人工核对。
删之前必须检查三个隐式引用点
看似没调用,实则不能删的典型场景:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
init()函数里调用了它,或在包级变量初始化中使用(var x = helper()) - 函数名被字符串硬编码,比如用于
runtime.FuncForPC、日志上下文或错误包装(fmt.Errorf("failed in %s", "helper")) - 它实现了某个接口(哪怕没显式声明),而该接口被其他包通过类型断言或泛型约束间接使用
这些地方不会出现在调用图里,deadcode 也扫不到,靠工具无法覆盖。
删完别忘了跑一遍 go test -race 和 go build -gcflags="-l -N"
删函数后容易引发两类问题:
- 测试 panic:因为某些测试用例直接调用了被删函数,或依赖其副作用(如 init 侧效应)
- 符号残留:关优化编译后用
go tool nm demo | grep funcname确认函数真没了,避免 DCE 没生效却以为删干净了
真正安全的清理不是“找到就删”,而是“确认无间接依赖 + 测试全过 + 符号表清空”。这三步缺一不可,少一步都可能埋下 runtime panic 或逻辑错位的坑。










