go clean -cache 删除的是 $gocache 中的编译中间产物(.a 文件),基于源码与编译参数哈希缓存,切换 cgo_enabled、goos/goarch 或 go 版本会导致缓存失效但不自动清理。

缓存不是“脏了才清”,而是“用错场景就失效”——go clean -cache 本身不危险,但清完不重建、或清错对象,反而让构建更慢、行为更不可控。
go clean -cache 删的是什么,为什么改了代码却没生效
go clean -cache 清的是 $GOCACHE 目录下的编译中间产物(主要是 .a 文件),不是源码,也不是模块。它缓存的是「源码+编译参数」的哈希结果,一旦你切换了 CGO_ENABLED、GOOS/GOARCH、-ldflags 值,或者升级了 Go 版本,旧缓存就无法复用,但不会自动删除。
- 常见错误现象:
go build报找不到符号、链接失败、改了.go文件却没反应——大概率是缓存里混着不同构建模式的产物 - 执行前先确认路径:
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 中未复用缓存目录
go clean -modcache 清的是模块缓存,不是 GOPATH/src
go clean -modcache 删的是 $GOMODCACHE(默认为 $GOPATH/pkg/mod)里的所有解压源码、.zip 包和校验数据,和旧式 $GOPATH/src 手动 clone 的项目完全无关。
- 常见错误现象:
cannot find module providing package xxx、verifying github.com/xxx: checksum mismatch、go list -m all显示版本和go.mod对不上 - 执行前务必确认
GO111MODULE=on,否则go clean -modcache静默无效 - 不要在发布前临时执行——清理后
go build会重新下载所有依赖,耗时不可控;CI 中若需干净环境,应提前挂载并复用$GOMODCACHE,而非每次清 - 只想删某个模块?手动
rm -rf $GOMODCACHE/github.com/xxx@v1.2.3和$GOMODCACHE/cache/download/github.com/xxx更精准
go clean -testcache 只影响测试结果复用,不删日志输出
go clean -testcache 删的是测试结果缓存(存在 $GOCACHE 内,但路径前缀不同),让 go test 强制重跑,而不是返回 “cached”。这个缓存不存 t.Log() 或 panic 输出——那些本来就不缓存。
- 使用场景:改了测试逻辑但
go test还显示 “cached”;CI 中验证测试稳定性,需排除缓存干扰;怀疑测试通过/失败状态被污染 -
go clean -testcache和go clean -cache可同时运行:go clean -cache -testcache - 它不影响构建缓存,也不影响模块缓存,单独清理对构建速度无任何提升
- 如果你用
go run测试,它内部也走构建流程,但临时可执行文件名带时间戳,容易掩盖缓存是否生效——别靠它判断缓存状态
什么时候不该清缓存,以及真正能提速的关键点
频繁 go clean 不是提速手段,而是调试信号。真正影响构建速度的,是缓存是否被稳定复用,以及是否被无意绕过。
- CI 中每次构建都用新容器?那
go clean多余,重点该做的是复用$GOCACHE和$GOMODCACHE(如 GitHub Actions 用actions/cache缓存~/.cache/go-build和~/go/pkg/mod) - 开发时避免无意义的
-a、-n、-work,这些 flag 会跳过或干扰缓存逻辑 - 多可执行文件项目,用
go install ./替代go build ./——它会严格按输入生成缓存键,并把中间产物持久化进$GOCACHE,后续变更仅影响对应子命令 - 交叉编译最占空间,
linux/amd64、darwin/arm64各一份缓存;如无多平台需求,避免无意义的GOOS/GOARCH切换
缓存目录不是黑盒,但也不是随便 rm -rf 的地方;看清 go env 输出的实际路径,分清 GOCACHE 和 GOMODCACHE 的职责,比背命令重要得多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











