
Go 模块缓存默认存在哪
Go 模块缓存默认放在 $GOPATH/pkg/mod,不是 $GOROOT,也不是用户主目录下的隐藏文件夹。只要没显式设置 GOMODCACHE 环境变量,就走这个路径。
你可以用这条命令立刻确认当前实际位置:
go env GOMODCACHE
常见错误现象:手动删了 $GOPATH/pkg/mod 却发现 go build 仍能成功——那说明你可能启用了 GOPROXY=direct 且本地有 vendor,或者模块已被 Go 的构建缓存($GOCACHE)间接复用,但真正的源码级依赖包仍得从 GOMODCACHE 读。
改缓存位置要动环境变量,不是改 go.mod
go.mod 文件里写任何路径都影响不了模块缓存位置,它只管依赖声明和版本约束。真正起作用的是环境变量 GOMODCACHE。
- Linux/macOS:在 shell 配置里加
export GOMODCACHE=/data/go-mod-cache - Windows(CMD):用
set GOMODCACHE=D:\go-mod-cache - Windows(PowerShell):用
$env:GOMODCACHE="D:\go-mod-cache"
改完别忘了重启终端或重新加载配置,否则 go env GOMODCACHE 还是显示旧值。注意:新路径必须有写权限,否则 go get 或 go mod download 会静默失败或报 permission denied 错误。
清理缓存不能只靠 rm -rf,得用 go clean
直接删 $GOMODCACHE 目录看似彻底,但 Go 工具链内部还有索引和校验数据(比如 cache/download 下的 zip 和 checksum),手动删除容易留下脏状态,后续 go list -m all 可能报 invalid version 或反复重下。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
推荐做法是用 Go 自带命令清理:
go clean -modcache
它会安全清空整个模块缓存,并同步更新内部状态。如果只想删某一个模块(比如调试时频繁换分支),可以用:
go clean -modcache && go mod download example.com/foo@v1.2.3
注意:go clean -modcache 不会影响 $GOCACHE(编译对象缓存)或 $GOPATH/bin(安装的二进制),它们是独立路径。
多项目共用缓存时要注意磁盘配额和并发写入
默认所有项目共享同一个 GOMODCACHE,好处是节省空间,坏处是大团队或 CI 环境下容易触发磁盘爆满,而且 go mod download 并发高时可能因文件锁导致短暂卡顿(尤其 NFS 或某些云盘挂载路径)。
应对方式取决于场景:
- CI 流水线:建议每个 job 使用独立
GOMODCACHE(如/tmp/go-mod-cache-$CI_JOB_ID),避免交叉污染和锁争用 - 本地开发多项目:可以保留默认,但定期用
du -sh $GOMODCACHE | sort -h看体积,超过 5GB 就该考虑go clean -modcache - 企业级部署:若用统一 NFS 存储,务必确认服务器端支持
flock,否则可能出现cannot lock …/cache/download/xxx.lock报错
缓存路径本身不参与构建结果哈希,所以换位置不会导致重编译,但首次切换后所有模块都要重下——这点容易被忽略,尤其在离线或代理受限环境。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










