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

Go 模块缓存路径由 GOPATH 和 GOCACHE 共同决定
Go 1.11+ 默认启用模块模式后,依赖下载和构建产物会分别存放在两个位置:$GOPATH/pkg/mod 存放已下载的模块源码(go mod download 或 go 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 会重新下载所有依赖,且丢失本地 replace 或 require ./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 是基础动作。

