go clean -cache清$gocache中.a编译产物,-modcache清$gomodcache模块源码与校验数据,-testcache清测试结果缓存;三者作用域不同,须按需选用并验证路径,乱删$gopath/pkg等目录易致构建失败。

Go 缓存不清理,磁盘空间会越积越多,但乱删可能让构建变慢甚至失败——关键不是“清不清”,而是“清什么、什么时候清、怎么验证清对了”。
go clean -cache 清的是编译中间产物,不是源码或模块
它删的是 $GOCACHE 目录下的 .a 文件(归档对象),这些文件由 go build 和 go test 生成,用于加速重复构建。改了代码却没生效、切换 CGO_ENABLED 后链接失败、GOOS/GOARCH 变更后行为异常,大概率是缓存里混着不同构建模式的产物。
- 执行前先确认路径:
go env GOCACHE(macOS 默认是$HOME/Library/Caches/go-build,Linux 是$HOME/.cache/go-build) -
go clean -cache不会清空整个目录,只删“过期”条目;真要彻底清,得rm -rf $(go env GOCACHE)/*(注意末尾/*,别漏掉星号,也别误删父目录) - 清理后首次构建明显变慢是正常表现;如果之后还慢,说明根本没命中缓存——检查是否用了
-a、GOCACHE=off,或 CI 中未复用缓存目录 - 如果
GOCACHE=off,该命令就什么也不做
go clean -modcache 清的是模块下载缓存,和 GOPATH/src 无关
它删的是 $GOMODCACHE(默认为 $GOPATH/pkg/mod)里的所有解压源码、.zip 包和校验数据。这不是旧式 $GOPATH/src 手动 clone 的项目,所以删了不会影响你 git 管理的代码。
- 执行前务必确认
GO111MODULE=on,否则go clean -modcache静默无效 - 常见错误现象:
cannot find module providing package xxx、verifying github.com/xxx: checksum mismatch、go list -m all显示版本和go.mod对不上 - 不要在发布前临时执行——清理后
go build会重新下载所有依赖,耗时不可控 - 只想删某个模块?手动
rm -rf $GOMODCACHE/github.com/xxx@v1.2.3和$GOMODCACHE/cache/download/github.com/xxx更精准 - 清理后建议立刻跑
go mod verify,确保后续拉取的模块和go.sum一致
go clean -testcache 只影响测试结果复用,不删日志或 panic 输出
它删的是测试结果缓存(存在 $GOCACHE 内,但路径前缀不同),让 go test 强制重跑,而不是返回 “cached”。这个缓存不存 t.Log() 或 panic 输出——那些本来就不缓存。
- 使用场景:改了测试逻辑但
go test还显示 “cached”;CI 中验证测试稳定性,需排除缓存干扰;怀疑测试通过/失败状态被污染 -
go clean -testcache和go clean -cache可同时运行:go clean -cache -testcache - 它不影响构建产物,也不影响模块缓存,单独清理不会释放大量磁盘空间
别直接 rm -rf $GOPATH/pkg,现代 Go 缓存不在那儿
Go 1.10+ 默认启用 $GOCACHE,而 $GOPATH/pkg 现在主要存 vendor 化或 legacy 构建产物。盲目删 $GOPATH/pkg 可能残留锁文件、破坏 vendor 构建一致性,甚至让某些工具链报错。
- 真正该清的是
$GOCACHE(用go clean -cache)和$GOMODCACHE(用go clean -modcache) - 检查路径:
go env GOCACHE和go env GOPATH,确认你删的是对的地方 - 长期节省空间:CI 或临时调试机可禁用缓存,如
GOCACHE=off go build;模块缓存无法完全关,但可限制大小:go env -w GOMODCACHE=$HOME/go/pkg/mod - 交叉编译产物最占空间(
linux/amd64、darwin/arm64各一份),如无多平台需求,避免无意义的GOOS/GOARCH切换
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











