Go模块缓存分两处:$GOPATH/pkg/mod存源码,$GOCACHE存编译中间文件;需用go env查看真实路径,清理应优先用go clean -modcache而非手动删除。

如何在Golang中查看模块缓存位置_Golang模块缓存机制说明  第1张

Go 模块缓存路径由 GOPATHGOCACHE 共同决定

Go 1.11+ 默认启用模块模式后,依赖下载和构建产物会分别存放在两个位置:$GOPATH/pkg/mod 存放已下载的模块源码(go mod downloadgo build 触发),而 $GOCACHE(默认为 $HOME/Library/Caches/go-build macOS / $HOME/.cache/go-build Linux / %LocalAppData%\go-build Windows)存放编译中间对象(如 .a 文件)。两者不可混淆——删错位置会导致重复下载或重编译。

go env 查看真实缓存路径

直接运行命令获取当前环境下的实际路径,避免手动拼接出错:

go env GOPATH GOCACHE GOPROXY

重点关注输出中的:

  • GOPATH:若未设置,默认是 $HOME/go;其子目录 pkg/mod 就是模块源码缓存根目录
  • GOCACHE:编译缓存路径,影响 go test -count=1 等是否命中缓存
  • GOPROXY:确认是否走代理,影响 pkg/mod/cache/download/ 下的归档包来源

pkg/mod 目录结构不是扁平的,带校验和与版本重写

$GOPATH/pkg/mod 下看不到干净的 github.com/user/repo@v1.2.3 目录。真实结构是:

立即学习“go语言免费学习笔记(深入)”;

  • 模块源码存于 cache/download/ 下,文件名含校验和(如 github.com/user/repo/@v/v1.2.3.zip.info.mod
  • 解压后路径类似 github.com/user/repo@v1.2.3-0.20230101000000-abcdef123456,其中时间戳+提交哈希是 go 自动生成的伪版本(pseudo-version)
  • 符号链接 github.com/user/repo@v1.2.3 指向上述伪版本目录,供 go list -m all 等命令识别

这意味着不能靠「删掉某个版本文件夹」来清理特定模块——必须用 go clean -modcache,否则可能破坏模块完整性。

清理缓存要分场景,别一股脑 rm -rf pkg/mod

手动删除 pkg/mod 虽然能清空,但下次 go build 会重新下载所有依赖,且丢失本地 replacerequire ./local 的软链接状态。更稳妥的方式是:

  • 仅清模块源码缓存:go clean -modcache(推荐,保留 GOCACHE 编译结果)
  • 仅清编译缓存:go clean -cache
  • 同时清两者:go clean -modcache -cache
  • 想删某个模块?用 go mod download -json github.com/user/repo@v1.2.3 先确认存在,再进 pkg/mod/cache/download/ 手动删对应 zip/info/mod,但不建议常规操作

缓存路径本身不常变,但 GO111MODULE=off 时模块机制失效,pkg/mod 不会被使用——检查 go env GO111MODULE 是基础动作。