Go build生成的中间文件默认存于$GOCACHE(如macOS为$HOME/Library/Caches/go-build,Linux为$HOME/.cache/go-build),用于缓存.a片段以加速增量构建;此外,依赖包归档.a文件还可能落盘至$GOPATH/pkg或$GOMODCACHE。

Go build 生成的中间文件默认在哪
Go 编译过程不写入磁盘中间文件(如 .o、.a),所有构建产物都在内存中完成,最终只输出可执行文件或 .a 归档(仅在 go build -buildmode=archive 时)。但有两个例外位置会落盘临时内容:
-
$GOCACHE(默认$HOME/Library/Caches/go-buildmacOS /$HOME/.cache/go-buildLinux):存放编译对象缓存(.a片段哈希目录),用于增量构建加速 -
$GOPATH/pkg或$GOMODCACHE(若启用了模块):存放已构建的依赖包归档(.a),供后续 import 复用
注意:go run main.go 也会触发缓存写入,且临时二进制文件(如 /tmp/go-build*/xxx)由 Go 自动创建并清理——但若进程被 kill 或磁盘满,可能残留。
如何安全清理 Go 中间缓存文件
别直接 rm -rf $GOCACHE,Go 的缓存是带校验与引用计数的,暴力删除可能导致后续构建失败或重复下载 module。正确做法是:
- 用
go clean -cache:清空$GOCACHE,Go 会验证并安全移除无引用项 - 用
go clean -modcache:清空$GOMODCACHE(即pkg/mod下的 downloaded modules),适用于换版本或怀疑 module 损坏 - 组合使用:
go clean -cache -modcache,适合 CI 环境或彻底重置构建环境 - 查看缓存大小:
go clean -cache -i(显示估算占用,不实际清理)
⚠️ 不要手动删 pkg/ 下的 .a 文件:它们被 go list -f '{{.Target}}' 引用,删了会导致 go build 重新编译所有依赖,反而更慢。
立即学习“go语言免费学习笔记(深入)”;
CI/CD 中避免中间文件污染的最佳实践
流水线里频繁 go clean 不等于高效。真正要控制的是缓存生命周期和路径隔离:
- 为每次 job 设置独立
GOCACHE目录,例如GOCACHE=$(pwd)/.gocache,job 结束后整体删掉目录,避免跨 job 缓存干扰 - 禁用模块缓存复用:
GO111MODULE=on GOPROXY=direct go build,配合-mod=readonly防止意外写go.sum - 避免
go get在构建阶段执行:它会写pkg/mod且可能升级依赖;应提前用go mod download固定版本 - 静态链接时加
-ldflags '-s -w',减少二进制体积,也间接降低对临时符号表缓存的依赖
本地开发时,go build 后残留的 /tmp/go-build* 目录通常几小时内自动回收;若发现长期存在,大概率是某个 goroutine panic 后未释放 os/exec.Cmd 或 exec.Command 调用卡住,需查日志定位异常进程。


















