go clean -cache 清理 $gocache 中过期或无效的编译缓存项(如源码删除、go版本升级后的残留),保留活跃缓存以维持构建速度,不删除整个目录或手动文件;若需彻底清空,须手动 rm -rf $gocache/*。

go clean -cache 到底清什么,为什么有时没效果
它只清理 $GOCACHE 目录里被标记为“过期”或“无效”的缓存项,比如源码已删、依赖版本变动、Go 工具链升级后的残留条目。不会清空整个目录,也不会碰你手动放进去的文件。
常见误判现象:go clean -cache 执行后 du -sh $GOCACHE 发现大小几乎没变——这正常。Go 会保留最近活跃的缓存项,避免频繁重建拖慢开发节奏。
- 真正想彻底清空,得手动执行
rm -rf $GOCACHE/*(注意别删错父目录) - CI 流水线里建议用
go clean -cache而非rm -rf,防止并发构建时误删正在使用的缓存 - 如果改了
CGO_ENABLED、切换了GOOS/GOARCH,旧缓存不会自动失效,必须手动清,否则可能静默链接失败
怎么改 GOCACHE 路径,哪些地方容易设错
GOCACHE 是纯环境变量控制,没有配置文件或命令行开关。它在 shell 启动时设一次,所有后续 go 命令都会继承。
Linux/macOS 下加到 ~/.bashrc 或 ~/.zshrc:
export GOCACHE=/mnt/ssd/go-build
Windows PowerShell:
$env:GOCACHE="D:\go-cache"
容易踩的坑:
- 路径没写对,比如漏掉
/或拼错盘符,go env GOCACHE会显示空值或默认路径 - 目录不可写,
go build会静默降级回默认路径,但不报错;可通过ls -ld $GOCACHE检查权限 - Dockerfile 中设
ENV GOCACHE=/tmp/go-cache,但没确保该路径存在且可写,构建会失败并报write $GOCACHE/xxx: permission denied
go clean -modcache 和 go clean -cache 别混用
两者作用域完全不同:go clean -cache 清的是编译中间产物(.a 文件、语法分析结果),而 go clean -modcache 清的是 $GOMODCACHE(默认 $GOPATH/pkg/mod),即所有下载的模块 zip 和解压后的源码。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
典型使用场景:
- 怀疑某个模块 zip 损坏(
go mod verify失败但go.sum没报错)→ 用go clean -modcache - 切换私有代理(如从
proxy.golang.org切到自建GOPROXY)→ 清-modcache避免混入不同来源的同版本模块 - 磁盘快满了,先看
go env GOCACHE和go env GOMODCACHE各占多少,再决定清哪边
注意:go clean -modcache 是彻底删除整个目录,下次构建会重新下载所有依赖,首次构建明显变慢。
缓存目录磁盘满、权限异常时的实际报错和应对
磁盘满最直接的错误是:
write $GOCACHE/xxx: no space left on device
权限异常常见于 Docker 或 CI 环境,表现为构建卡住或静默失败,检查方式:
- 运行
go env GOCACHE确认路径 - 执行
touch $GOCACHE/test && rm $GOCACHE/test验证可写性 - 若失败,查父目录属主和权限,尤其注意容器里挂载 volume 后 uid/gid 是否匹配
长期节省空间的关键点:交叉编译产物最占空间(linux/amd64、darwin/arm64 各一份),没多平台需求就别无意义地切 GOOS/GOARCH;CI 中可临时禁用缓存:GOCACHE=off go build,避免堆积。
缓存不是黑盒,但也不是随便 rm -rf 的地方;看清 go env 输出的实际路径,分清 GOCACHE 和 $GOMODCACHE 的职责,比背命令重要得多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










