go mod tidy 只补全缺失模块、删除未直接引用的模块,不清理未使用的函数或类型;必须在修改import、新增/删除包引用、go.sum校验失败或ci报错时运行。

go mod tidy 不是“清理依赖”的万能按钮,它只做两件事:补全缺失的模块、删掉没被直接引用的模块——但不会删掉间接依赖里你没用到的函数或类型。
什么时候必须用 go mod tidy?
当你改了 import 语句、新增了包引用、或者删掉了某个 import 却发现 go build 还能过,但 CI 报错“module not found”时,就得运行它。
- 刚拉下别人代码,
go.mod里写的版本和本地go.sum对不上,go build提示校验失败 → 必须go mod tidy - 你写了
import "github.com/sirupsen/logrus",但没真正调用任何 logrus 函数 →go mod tidy会把它从go.mod里删掉(因为没被“直接使用”) - 你用了
logrus.WithField(),但删掉了 import 行 →go mod tidy不会帮你加回来,得先让代码能编译通过
go mod tidy 为什么有时删不掉旧模块?
常见于你曾经用过某个模块的 A 版本,后来换成了 B 版本,但 A 版本仍被其他依赖间接引用。这时 go mod tidy 不会动它——Go 的模块 resolver 要保证所有间接依赖能解析成功。
- 运行
go mod graph | grep 模块名查谁还在拉这个旧模块 - 想强制剔除?别硬删
go.mod里的行,先用go get 模块名@none,再go mod tidy - 注意:
go get xxx@none可能导致构建失败,如果那个模块其实是 runtime 依赖(比如某些插件机制)
为什么 go mod tidy 后 go.sum 变大了?
它不只是更新你显式依赖的校验和,还会把所有间接依赖(transitive deps)的每个版本哈希都记下来。这是 Go 的确定性构建保障,不是冗余。
- 不要手动删
go.sum里的行,哪怕看着“没用”——下次go mod tidy会重新写回去 - 如果你在 CI 里看到
go.sum被修改,说明本地环境和 CI 的 Go 版本或代理设置不一致,导致解析出的间接依赖版本不同 - Go 1.21+ 默认开启
GOSUMDB=sum.golang.org,若公司内网无法访问,需提前配好GOSUMDB=off或私有 sumdb
最常被忽略的一点:go mod tidy 不检查你的代码有没有真正用到某个模块的某个符号——它只看 import 语句是否出现在 .go 文件里。所以删了 import 却忘了删对应逻辑,运行时报 undefined: xxx 是必然的,不是 tidy 的问题。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











