Go模块下载后默认缓存到$GOPATH/pkg/mod(即GOMODCACHE),是全局共享路径,结构为cache/域名/模块名@版本;go mod download仅拉取不校验,-mod=readonly构建时禁止自动修改,清理用go clean -modcache。

go mod download 会把包存到哪里
Go 模块下载后默认缓存到 $GOPATH/pkg/mod,不是项目目录下,也不是 $GOROOT。这个路径是全局共享的,所有项目共用同一份缓存,避免重复下载相同版本。
你可以用命令确认当前路径:
go env GOPATH go env GOMODCACHE
GOMODCACHE 是实际缓存位置(Go 1.13+ 默认为 $GOPATH/pkg/mod),它可能和 GOPATH 不同——比如你设置了 GOENV 或自定义了 GOMODCACHE 环境变量。
- 若
GOMODCACHE未显式设置,Go 会按规则推导,但始终以该变量值为准 - Windows 下路径含
\,但 Go 内部统一处理为正斜杠,脚本中建议用/或filepath.Join - 缓存目录结构是
cache/域名/模块名@版本/...,例如golang.org/x/net@v0.25.0对应golang.org/x/net@v0.25.0/子目录
go mod download 和 go build -mod=readonly 的关系
go mod download 只拉取模块到本地缓存,不修改 go.mod 或 go.sum;而 go build -mod=readonly 在构建时禁止任何模块自动修改行为——包括自动下载、自动升级、自动写入 go.sum。
立即学习“go语言免费学习笔记(深入)”;
两者配合使用,能确保构建环境干净且可复现:
1、数据调用该功能使界面与程序分离实施变得更加容易,美工无需任何编程基础即可完成数据调用操作。2、交互设计该功能可以方便的为栏目提供个性化性息功能及交互功能,为产品栏目添加产品颜色尺寸等属性或简单的留言和订单功能无需另外开发模块。3、静态生成触发式静态生成。4、友好URL设置网页路径变得更加友好5、多语言设计1)UTF8国际编码; 2)理论上可以承担一个任意多语言的网站版本。6、缓存机制减轻服务器
- CI 流水线中先跑
go mod download,再设GOFLAGS=-mod=readonly,防止因网络抖动或镜像源异常导致构建中途失败 - 如果
go.sum缺失校验项,-mod=readonly会直接报错missing hash in go.sum,不会尝试补全 -
go mod download不验证go.sum,它只按go.mod中声明的版本拉包;真正校验发生在go build或go list阶段
清理缓存:go clean -modcache 安全吗
go clean -modcache 会彻底删除整个 GOMODCACHE 目录,不可撤销。它不区分项目、不识别引用计数,删完所有模块都得重下。
这不是“卸载”某个模块的操作,而是“清空全部缓存”的重型命令:
- 执行前建议确认当前
GOMODCACHE路径,避免误删其他用途的目录(比如你把它软链到了 SSD 外挂盘) - 没有“只删未使用模块”的内置机制;如果只想删某一个模块,得手动
rm -rf $GOMODCACHE/域名/模块名@版本 - 某些 IDE(如 VS Code + Go extension)会在后台静默触发
go list,可能立即重新拉取部分模块,造成“刚删完又出现”的错觉
更换代理后旧缓存还能用吗
能用。Go 模块缓存内容与下载源无关,只和模块路径、版本、校验和有关。只要 go.mod 中的 require 行没变,换代理(比如从 proxy.golang.org 切到 goproxy.cn)不影响已有缓存读取。
但要注意这些边界情况:
- 如果新代理返回的 zip 包内容与原始校验和不一致(极罕见,通常意味着镜像源出问题),Go 会在构建时报
checksum mismatch,并拒绝使用缓存 - 私有模块(如
git.example.com/my/lib)若改用 SSH 替代 HTTPS,路径视为不同模块,会另存一份缓存 -
go get -insecure或自定义replace指向本地路径时,缓存仍存在,但不再走远程下载流程
缓存是否生效,最终取决于 go list -m all 输出的模块路径和版本能否在 GOMODCACHE 中精确匹配——跟你怎么下的没关系。









