go clean -cache 清除的是 Go 构建缓存($GOCACHE 中的 .a 文件),不影响模块缓存(-modcache)和测试结果缓存(-testcache);后者需单独清理或组合使用。

go clean -cache 清的是什么缓存
它清的是 Go 构建过程中生成的 build cache,也就是编译器把源码编译成中间对象(.a 文件)后存下来的那份缓存。不是模块下载缓存(那是 go clean -modcache),也不是测试结果缓存(Go 本身不持久存测试结果,但 go test 会用 build cache 加速重复运行)。
常见错误现象:go build 速度突然变慢、改了代码却没生效、CI 上构建结果和本地不一致——往往是因为缓存里混进了旧的依赖或损坏的对象。
-
go clean -cache只删$GOCACHE目录下的内容(默认是$HOME/Library/Caches/go-buildmacOS /%LOCALAPPDATA%\go-buildWindows /$HOME/.cache/go-buildLinux) - 不会影响已下载的模块(
go mod download下载的包在$GOPATH/pkg/mod,得用go clean -modcache) - 执行后首次构建会明显变慢,之后逐步恢复——这是正常现象,别慌
go clean -testcache 清除的是测试加速缓存
Go 1.10+ 引入了测试结果缓存机制:只要源码、依赖、编译器、flags 没变,go test 就直接复用上次的通过/失败结果,跳过真正执行。这个缓存独立于 build cache,存在同一 $GOCACHE 目录下,但路径前缀不同。
使用场景:改了测试逻辑但 go test 还显示 “cached”;想强制重跑所有测试(比如 CI 验证稳定性);怀疑测试结果被缓存污染。
-
go clean -testcache只删测试结果缓存,不影响 build cache 或 mod cache - 它不会清掉你
testing.T.Log()输出的内容——那些本来就不缓存 - 如果同时想清 build + test 缓存,可以一起跑:
go clean -cache -testcache
什么时候必须用 go clean -modcache
当你遇到 cannot find module providing package xxx、require ...: version "xxx" invalid、或者 go list -m all 显示的模块版本和 go.mod 对不上时,大概率是 go mod download 下载的模块缓存出问题了。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
这个缓存存在 $GOPATH/pkg/mod,里面是带校验和的只读副本。它不随 go clean -cache 被清理,必须显式调用 -modcache。
-
go clean -modcache会删掉整个$GOPATH/pkg/mod,下次go build或go test会重新下载所有依赖 - 如果你用了
GOPROXY=direct或离线环境,删完后没网就构建失败——这点容易被忽略 - 模块缓存损坏通常发生在磁盘异常、强制中断
go get、或手动修改了pkg/mod目录时
CI 环境中要不要加 go clean
大多数现代 CI(GitHub Actions、GitLab CI)默认用干净容器,不需要主动 go clean。但如果你复用 runner、挂载了缓存目录、或用了自建缓存策略(比如缓存 $GOCACHE),那就得小心。
性能影响很实际:缓存能提升 30%~60% 的构建速度,但脏缓存会让 CI 偶发失败,排查成本远高于多花几秒重建。
- 推荐做法:在 CI 的 job 开头加
go clean -cache -testcache,保留-modcache(除非你确定模块有变更且想强制重拉) - 不要在每次
go test前都go clean -cache——这等于放弃 Go 的核心加速机制 - 如果用
actions/cache缓存$GOCACHE,记得设置 key 包含 Go 版本和依赖哈希(如go-${{ runner.os }}-go${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }})
缓存路径、作用域、失效条件这三者一旦错配,就会变成“看起来快,实则埋雷”的状态。动手前先看一眼 go env GOCACHE GOPATH 和 go list -m -f '{{.Dir}}' std,比盲目清理更省时间。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










