应根据需求分别清理:go clean -cache清$GOCACHE编译缓存(.a文件),影响构建速度但不破坏依赖;go clean -modcache清$GOPATH/pkg/mod模块源码缓存,会强制重新下载所有依赖,适用于模块冲突或校验失败场景。

go clean -cache 和 go clean -modcache 到底该清哪个?
现代 Go(1.10+)默认启用 $GOCACHE 存编译中间产物(.a 文件),而模块源码缓存走 $GOPATH/pkg/mod。两者职责不同,不能只删一个:
• go clean -cache 清的是 $GOCACHE,影响构建速度但不破坏依赖一致性
• go clean -modcache 清的是 $GOPATH/pkg/mod,会强制重新下载所有模块,适合模块冲突或校验失败时用
• 不要手动 rm -rf $GOPATH/pkg:可能残留锁文件,且 pkg 目录现在主要用于 vendor 构建,不是主缓存区
为什么磁盘空间没立刻释放?常见误判点
go clean 执行后空间未减少,多数不是命令失效,而是环境干扰:
• Linux 下进程正占用已删除的缓存文件(如后台 IDE 构建、go run 进程未退出),空间需等进程关闭才归还
• go build 默认跳过未改动文件的重编译,你以为“没清干净”,其实是没触发重建;加 -a 强制全量编译才能验证:go build -a ./...
• 某些 CI 工具或 Dockerfile 里用了 go env -w GOCACHE=off,但本地没关,导致缓存持续堆积
交叉编译和多平台构建最吃磁盘,怎么省?
每个 GOOS/GOARCH 组合(如 linux/amd64、darwin/arm64)都会在 $GOCACHE 中存一份独立编译产物,极易撑爆磁盘:
• 日常开发除非真要发布多平台二进制,否则避免无意义切换:unset GOOS GOARCH 回退到默认平台
• CI 环境中可临时禁用缓存:GOCACHE=off go build,反正每次都是干净环境
• 模块缓存虽不能完全关,但可通过 go env -w GOMODCACHE=$HOME/go/pkg/mod 显式限定路径,配合定期 go clean -modcache 控制增长
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
长期节省空间的关键不是“勤清理”,而是“少生成”
频繁 go clean 是治标,真正省空间得从源头控制:
• 关掉不需要的构建缓存:go env -w GOCACHE=off(注意:后续每次构建变慢,仅推荐 CI 或调试机)
• 避免频繁分支切换和 go get 升级——每次操作都可能留下旧版本缓存
• 检查 go env GOCACHE 和 go env GOPATH 输出的实际路径,确认你清理的是正在被使用的缓存目录,而不是空目录或挂载点
• $GOCACHE 默认在 $HOME/Library/Caches/go-build(macOS)或 $HOME/.cache/go-build(Linux),别只盯着 $GOPATH/pkg 猜
立即学习“go语言免费学习笔记(深入)”;

















