go clean -modcache 清的是 $GOMODCACHE 下的模块 zip 包、解压源码及校验文件,但不删 go.mod、go.sum 和 vendor/;清完仍报 checksum mismatch,主因是私有代理内容与 go.sum 记录不符,或手动修改过缓存源码而 go.sum 未更新。

go clean -modcache 清的是什么,为什么清完还报 checksum mismatch
它删的是 $GOMODCACHE(默认为 $GOPATH/pkg/mod)下所有已下载的模块 zip 包、解压后的源码目录、校验文件(cache/download/xxx/.zip、.info、.ziphash),但不碰 go.mod、go.sum 和 vendor/。清完仍报 checksum mismatch,大概率是:私有代理返回的模块内容和 go.sum 里记录的原始校验和对不上;或者你本地手动改过 pkg/mod 里的某个模块源码,而 go clean -modcache 只删缓存,不重写 go.sum。
解决办法:go mod verify 先确认当前缓存是否一致;若失败,再执行 go clean -modcache,然后立刻跑 go mod download 或 go build -v ./ 观察实际拉取地址——每行开头的 Fetching 就是真实来源,确保它指向你预期的代理或仓库。
go clean -cache 和 -modcache 必须一起用吗
不是必须,但常见场景下建议配对使用:
-
go clean -cache清$GOCACHE下的编译中间产物(.a文件),影响构建速度和符号链接行为; -
go clean -modcache清$GOMODCACHE下的模块源码与包,影响依赖解析和校验逻辑。
两者独立生效。比如你只切了 CGO_ENABLED,那只需 go clean -cache;但如果你刚从私有代理切回 proxy.golang.org,或怀疑某模块 zip 损坏,则必须 go clean -modcache,否则旧缓存会继续被复用,go mod verify 依然失败。
立即学习“go语言免费学习笔记(深入)”;
真正“彻底”清理遗留,命令是:go clean -cache -modcache -i。注意:-i 只删当前目录 main 包安装的二进制,别指望它扫完整个 $GOBIN。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
清完之后 go build 还拉错版本?检查 GOPROXY 和 GOPRIVATE
清空缓存后首次 go build 会重下依赖,但拉哪个版本、从哪拉,完全由环境变量控制:
-
GO111MODULE=on必须启用,否则go clean -modcache静默无效; -
GOPROXY决定拉取路径,默认是https://proxy.golang.org,direct;若设了私有代理(如 Nexus),但没配置GOPRIVATE,Go 会跳过校验直接拉,导致go.sum不匹配; -
GOPRIVATE=git.internal.company.com必须显式设置,否则即使代理返回了正确 zip,校验阶段也会 fallback 到sum.golang.org查不到记录,报checksum mismatch。
验证方式:go env GOPROXY GOPRIVATE GO111MODULE,三者都得对。尤其注意 GOPRIVATE 是逗号分隔的域名列表,不能带协议或路径。
rm -rf $GOPATH/pkg/mod 后 go mod tidy 还慢?那是网络或配置问题
执行 rm -rf $(go env GOPATH)/pkg/mod 确实能清空模块缓存,但后续 go mod tidy 变慢,和缓存无关,而是以下原因:
-
GOPROXY配置错误或不可达,Go 会 fallback 到 vcs(git clone),卡在 DNS 或 SSH 认证上; -
go.sum里记录的是旧 commit hash,而远程 tag 已删或 force push 过,导致go mod download反复失败重试; - 项目含大量
replace,且目标路径不存在或权限不足,tidy会逐个尝试解析并超时。
提速技巧:go mod tidy -v 开启详细日志,看卡在哪一行;临时设 GOPROXY=https://goproxy.cn(国内镜像)测试是否网络问题;若确认是 replace 导致,先注释掉再 tidy,成功后再恢复。
真正容易被忽略的点:go clean -modcache 不会自动更新 go.sum,它只是清目录;go mod tidy 才负责同步校验和。所以清理后第一件事不是跑 build,而是先 go mod tidy,否则 go build 可能用旧 go.sum 去校验新拉的模块,直接失败。

















