go clean -cache 删除 $gocache 中已编译的中间产物(.a 文件),用于加速构建和测试;若源码或依赖变更,旧缓存可能导致构建不一致,需清理以确保正确性。

Go语言里没有统一的“cache清除”命令,所谓“清除cache”必须先分清你指的是哪一层缓存:构建缓存(go clean -cache)、模块下载缓存(go clean -modcache)、测试结果缓存(go clean -testcache),还是你代码里自己用 map、sync.Map 或第三方库(如 github.com/patrickmn/go-cache)实现的运行时内存缓存。混用或误判,清理就白干。
go clean -cache 删的是什么,为什么改了代码不生效还怪它
它删的是 $GOCACHE 目录下已编译的中间产物(.a 文件),不是源码,也不是模块。这些文件让 go build 和 go test 跳过重复编译,但一旦源码、依赖或 Go 版本变动,旧缓存可能被错误复用。
- 常见错误现象:
go build速度突然变慢、改了函数逻辑却没触发重新编译、CI 构建结果和本地不一致 - 执行前确认路径:
go env GOCACHE(macOS 默认是$HOME/Library/Caches/go-build) -
go clean -cache不会清空整个目录,只删“过期”条目;要彻底清,得用:rm -rf $(go env GOCACHE)/*(注意末尾/*,别漏掉) - 如果设了
GOCACHE=off,这条命令什么也不会做 - 清理后首次构建明显变慢——这是正常表现,缓存重建需要时间
go clean -modcache 清的是模块源码,不是 GOPATH/src
它删的是 $GOMODCACHE(默认为 $GOPATH/pkg/mod)里的所有解压后的模块源码、.zip 包和校验数据。这个操作和你在 $GOPATH/src 下手动 git clone 的项目完全无关。
- 常见错误现象:
cannot find module providing package xxx、checksum mismatch、go list -m all显示的版本和go.mod对不上 - 执行前务必确认
GO111MODULE=on,否则go clean -modcache静默无效 - 不要在发布前临时执行——清理后
go build会重新下载所有依赖,耗时不可控 - 只想删某个模块?手动删更安全:
rm -rf $GOMODCACHE/github.com/xxx@v1.2.3和$GOMODCACHE/cache/download/github.com/xxx - 清理后建议立刻跑
go mod verify,确保后续拉取的模块和go.sum一致
你自己写的 map / go-cache 怎么清,别用 for range delete
运行时内存缓存(比如 map[string]interface{}、sync.Map、github.com/patrickmn/go-cache)不会被 go clean 命令触碰,必须在代码里显式处理。
- 用
map+sync.RWMutex:遍历时不能直接delete(),应先收集 key,再单独删;或改用for k := range m { delete(m, k) }(仅当无并发读写时安全) - 用
sync.Map:它不支持安全遍历+删除组合操作,得换回普通map+sync.RWMutex才能可控清理 - 用
go-cache库:调c.Flush()清空全部;或c.Delete("key")删单个;注意它的Set()支持cache.NoExpiration和自定义过期时间,清理逻辑需匹配 - 定时清理别用
for range map:易触发迭代器失效;推荐每次只扫固定数量(如 100 条),配合time.Ticker和快照时间now := time.Now()判断过期 - 别在
RWMutex.RLock()持有期间做 HTTP 请求或 DB 查询,否则拖慢所有读请求
为什么 go clean -cache 后 CI 还是构建失败
因为 go clean -cache 不动模块缓存,也不影响你代码里手写的缓存逻辑。CI 失败大概率是环境变量没对齐、GOPROXY 配置异常,或者你删了 -modcache 却没网、没配代理。
- 检查
GO111MODULE、GOPROXY、GOSUMDB是否和本地一致 - CI 中若用
go clean -modcache,必须确保网络通畅或GOPROXY可用,否则go build会卡在 “downloading” - Docker 构建中,
GOCACHE和GOMODCACHE必须挂载 volume 或 tmpfs,否则每次构建都从零开始 - 别信 “一键清空所有缓存” 脚本——
go clean -cache -modcache -testcache看似全面,但会强制重下模块+重编所有包,CI 时间翻倍
最常被忽略的一点:缓存是否“该清”,比“怎么清”更重要。构建变慢先看 go list -f '{{.Stale}}' .,模块报错先跑 go mod verify,测试跳过先试 go clean -testcache。盲目清缓存,只是把问题从缓存层推到网络或磁盘 IO 层。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











