go clean -modcache 仅清 $GOMODCACHE 下的解压源码、.zip 包和校验数据,不清理 cache/download 中的 .info/.ziphash 文件,且在私有代理切换、GO111MODULE 状态变更或手动修改 pkg/mod 时可能静默跳过部分子目录,导致 checksum mismatch 或版本错乱。

go clean -modcache 为什么删不干净旧模块
它只清 $GOMODCACHE(默认是 $GOPATH/pkg/mod)下的解压源码、.zip 包和校验数据,但不会动 cache/download 里残留的 .info 文件或损坏的 .ziphash。尤其当私有代理切换、GO111MODULE=off 后又切回 on、或本地手动改过 pkg/mod 里的文件时,go clean -modcache 可能静默跳过部分子目录。
常见错误现象:go mod verify 报 checksum mismatch、go list -m all 显示版本和 go.mod 不符、go get github.com/xxx@v1.2.3 却拉来 v1.2.2 的代码。
- 执行前先确认模块模式已启用:
go env GO111MODULE必须输出on,否则命令无效 - 运行
go clean -modcache后,立刻补一句rm -rf $(go env GOPATH)/pkg/mod/cache/download/*,强制清空下载元数据 - 若用过私有 GOPROXY,清理后建议重设:
go env -w GOPROXY=https://proxy.golang.org,direct
哪些模块缓存必须手动删,不能靠 go clean
当你怀疑某个模块 zip 损坏、或想精准移除已下线的私有库时,go clean -modcache 的全量删除太粗暴——它会把所有依赖重下一遍,CI 构建时间翻倍,团队协作也容易带宽拥堵。
更安全的做法是定位到具体路径手动删:
立即学习“go语言免费学习笔记(深入)”;
- 查模块实际路径:
go list -m -f '{{.Dir}}' github.com/xxx/yyy@v1.2.3 - 删源码目录:
rm -rf $(go env GOPATH)/pkg/mod/github.com/xxx/yyy@v1.2.3 - 删下载缓存:
rm -rf $(go env GOPATH)/pkg/mod/cache/download/github.com/xxx/yyy - 删完立刻跑
go mod verify,确认go.sum和新拉取内容一致
GOROOT/GOPATH 环境变量残留导致模块缓存“假清理”
你删了 /usr/local/go,也跑了 go clean -modcache,但新装的 Go 一跑就去读 /home/user/sdk/go/pkg/mod——说明 GOROOT 或 GOPATH 还在生效,新 Go 被骗去用了旧路径下的缓存。
典型信号:which go 返回 /usr/local/go/bin/go,但 go env GOROOT 显示别的路径。
- 搜所有 shell 配置:
grep -n 'GOROOT\|GOPATH' ~/.zshrc ~/.bash_profile ~/.profile /etc/profile - 删掉所有
export GOROOT=...和export GOPATH=...行 - 重启终端,再运行
unset GOROOT GOPATH后检查go env GOROOT是否为空或自动推导值 - Windows 用户务必检查系统级环境变量(不只是用户变量),注册表里也可能埋着旧值
清理后首次构建慢是正常的,但慢得离谱可能漏了关键项
彻底清完 pkg/mod 和 cache/download 后,go build 会重下所有依赖,这本身就会慢。但如果发现它反复卡在某个私有模块、或拉错域名(比如该走 git.internal.company.com 却去连 github.com),大概率是以下三处没清干净:
-
go env GOPRIVATE没重设:清理后需手动恢复,否则私有模块被当成公共模块走 sum.golang.org 校验 -
go env GOSUMDB还是off或私有地址:建议重置为默认sum.golang.org,避免校验跳过 - IDE 缓存未刷新:VS Code 的 Go 扩展会缓存模块索引,关掉项目再重新打开,或执行
Go: Restart Language Server


















