运行 go env GOCACHE,若输出有效路径(如 $HOME/.cache/go-build)且非 off,说明缓存已启用;若为空或 off,则禁用,go build 会全量编译变慢。

如何确认 GOCACHE 当前是否生效
运行 go env GOCACHE,如果输出路径(如 $HOME/.cache/go-build)且非 off,说明已启用;若输出空或 off,则缓存被禁用,go build 会退化为全量编译,速度明显变慢。
常见误判点:看到 go build -a 变慢就以为是缓存失效——其实 -a 强制重编所有依赖,本就不走缓存,和 GOCACHE 是否启用无关。
修改 GOCACHE 路径的实操方式
只需设置环境变量,无配置文件、无命令行开关。不同系统写法如下:
- Linux/macOS:
export GOCACHE=/mnt/ssd/go-cache(建议加到~/.zshrc或~/.bashrc) - Windows PowerShell:
$env:GOCACHE="D:\go-cache" - Windows CMD:
set GOCACHE=D:\go-cache - Dockerfile:
ENV GOCACHE=/tmp/go-cache(确保该路径可写,且不与其它进程冲突)
注意:改完需重启终端或执行 source ~/.zshrc 才能生效;容器内若用 scratch 基础镜像,得提前 mkdir -p /tmp/go-cache,否则 go build 会报 permission denied。
立即学习“go语言免费学习笔记(深入)”;
为什么不能只靠 go clean -cache 清理磁盘空间
go clean -cache 只清理“过期”或“无效”的缓存条目(如源码已被删、Go 版本升级后残留),不会清空整个目录。执行后 du -sh $GOCACHE 发现大小几乎不变,是正常行为。
真正占满磁盘时,必须手动清理:
- 安全做法:
rm -rf $GOCACHE/*(注意结尾是/*,别漏掉星号,避免误删父目录) - CI 流水线中慎用
rm -rf:多个并发构建可能同时读写缓存,推荐仍用go clean -cache+ 定期定时清理 job - 如果
go build报错write $GOCACHE/xxx: no space left on device,说明磁盘已满,此时go clean -cache已无法写入,只能先腾出空间再操作
跨版本构建与缓存复用的边界在哪
Go 缓存自动按工具链版本隔离:从 1.21 升级到 1.22 后,旧缓存不会被读取,也不会被覆盖,而是并存。这意味着:
- 无需手动清理旧版缓存,也无需为多版本 Go 准备多个
GOCACHE目录 - 但若长期共用同一
GOCACHE目录,它会持续膨胀(各版本缓存累加),需定期评估容量 -
GOCACHE和GOPATH/pkg完全无关:前者存编译中间产物(.a、语法树等),后者存安装后的包对象,两者互不影响
最易被忽略的一点:缓存是否生效,不看路径是否存在,而看 Go 进程是否有写权限——比如 Docker 中挂载的 volume 若以只读方式挂载,GOCACHE 设再好也形同虚设。


















