应根据磁盘占用来源决定:若$gocache目录占用大且切换过cgo_enabled/goos/go版本,优先go clean -cache;若$gopath/pkg/mod膨胀严重且模块数少,则用go clean -modcache。

go clean -cache 和 go clean -modcache 到底该清哪个
看磁盘占用来源再决定,不是所有“pkg”目录都该删。现代 Go(1.10+)默认把编译缓存存在 $GOCACHE,而 $GOPATH/pkg/mod 存的是模块源码——两者职责不同,混着清容易白忙活。
- 如果
du -sh $(go env GOCACHE)占几个 GB,且你刚切过CGO_ENABLED、GOOS或 Go 版本,优先跑go clean -cache - 如果
du -sh $(go env GOPATH)/pkg/mod膨胀到 10GB+,但项目只依赖几十个模块,大概率是旧分支残留或私有代理缓存污染,用go clean -modcache - 别直接
rm -rf $GOPATH/pkg:它现在基本只存 vendor 构建产物,删了可能破坏go build -mod=vendor的一致性
为什么执行 go clean 后磁盘空间没立刻释放
Linux/macOS 下已打开的缓存文件被构建进程或 IDE(如 VS Code Go 插件)持有时,go clean 删除的是文件系统链接,实际空间要等进程关闭句柄才归还。这不是命令失效,是 OS 行为。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 验证是否真清了:运行
go clean -cache && lsof +D $(go env GOCACHE) | wc -l,输出为 0 才说明没进程在用 - 常见干扰源:VS Code 的后台分析、GoLand 的 indexing、CI 脚本里未退出的
go build进程 - 想立刻见效?先关掉 IDE,再执行
go build -a ./...强制重编译,触发缓存重建后旧文件句柄自动释放
交叉编译和 CGO 切换导致缓存堆积怎么办
每个 GOOS/GOARCH 组合、每种 CGO_ENABLED 状态都会生成独立缓存,不自动清理。比如你试过 GOOS=linux GOARCH=arm64 go build,又切回本地构建,两份缓存共存。
- 日常开发中避免无意义切换:确认目标平台后再设环境变量,别反复
export GOOS=xxx又unset GOOS - CI 环境建议加
GOCACHE=$(mktemp -d)临时禁用缓存,构建完自动销毁,比清理更省事 - CGO 切换后必须清缓存:
CGO_ENABLED=0 go build生成的 .a 文件和CGO_ENABLED=1的不兼容,静默链接失败,go clean -cache是唯一解
如何长期控制 Go 缓存不越长越大
缓存本身不是问题,失控的生命周期才是。Go 不提供 TTL 自动清理,得靠人设边界。
- 限制模块缓存位置和大小:
go env -w GOMODCACHE=$HOME/go/pkg/mod(明确路径),再配合定时脚本find $HOME/go/pkg/mod -name "*.zip" -mtime +30 -delete清老 zip 包 - 禁用不必要的缓存:CI 中设
GOCACHE=off;本地调试机若频繁切分支,可go env -w GOCACHE=$HOME/.go-cache-dev单独隔离 - 监控而非被动清理:加一行
alias gocheckcache='echo "GOCACHE: $(du -sh $(go env GOCACHE)) | MODCACHE: $(du -sh $(go env GOPATH)/pkg/mod)"'到 shell 配置里,每次开终端一眼可知
go env GOCACHE 和 go env GOPATH 确认实际路径,比背命令重要得多。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










