goland 默认不检查未使用的私有函数,因其仅分析 exported 符号;deadcode 是最准的命令行工具,基于 ast 做前向可达性分析,可精准定位包内未被引用的私有函数,但对 init 调用、包级变量初始化和反射调用无感知,需人工核对。

GoLand 本身不标记未使用的私有函数
GoLand 的 Inspection 功能默认只检查 exported 符号(首字母大写的变量、函数、类型),对 helper、parseConfig 这类小写开头的私有函数完全不报——这不是漏配,是设计如此。它不构建调用图,也不做前向可达性分析,所以别指望 Alt+F7(Find Usages)或编辑器波浪线能帮你发现“没人调用的私有函数”。删之前直接靠它判断,大概率 panic。
deadcode 是目前最准的命令行方案
真正能定位包内未被引用的私有函数的,只有 deadcode。它从 main 和测试入口出发,基于 AST 做前向可达性分析,输出精确到行号:
- 安装:
go install github.com/tsenart/deadcode@latest - 扫描整个模块:
deadcode . - 扫描子目录:
deadcode ./pkg/util - 典型输出:
pkg/util.go:42:6: unused func validateInput,点击即可跳转
注意:它对以下三类隐式调用无感知,必须人工核对:
-
init()函数里的调用 - 包级变量初始化(如
var x = helper()或var _ = helper) - 反射调用(
reflect.Value.Call)、插件加载、JSON 配置字符串驱动的函数
在 GoLand 里集成 deadcode 实现一键触发
你不需要反复切终端。把 deadcode 当作外部工具绑定快捷键即可:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 打开
Settings → Tools → External Tools - 点 + 添加:
– Name:Find unused private funcs
– Program:deadcode
– Arguments:.
– Working directory:$ProjectFileDir$ - 设快捷键(比如
Ctrl+Alt+U),之后按一下就在底部 Run 窗口出结果
输出中的路径+行号可直接点击跳转,但 GoLand 不会高亮、不会自动删——你仍得自己判断是否真能删。
全局搜索和 Find Usages 都不能替代 deadcode
别用 Ctrl+Shift+F 全局搜函数名,它搜不到这些:
- 被字符串拼接调用(
name := "helper"; callByName(name)) - 被构建标签屏蔽的文件里的引用(
//go:build !prod) - testutil 包里调用了它,但该包没被当前模块
import
也别依赖 Alt+F7(Find Usages)查私有函数——它只查显式引用,跨文件时漏掉取地址(&helper)、接口赋值(var _ io.Reader = &MyStruct{})、空接口赋值(var _ interface{} = helper)等间接场景。
真正安全的做法是:先跑 deadcode 得到候选列表,再对每个函数执行 grep -r "funcName" ./ --include="*.go",重点盯 init、包级 var、reflect. 和硬编码字符串。










