Go Proxy 是现代 Go 项目构建的必需基础设施,未配置或配置错误会导致模块下载失败;推荐使用 GOPROXY=https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/go,direct,并配合 GOPRIVATE 设置私有仓库路径。

Go Proxy 不是可选配置,而是现代 Go 项目构建的基础设施——不配或配错,go build 和 go mod download 就会卡在第三方模块拉取环节,尤其在国内网络环境下几乎必然失败。
为什么 GO111MODULE=on 后仍无法下载模块?
根本原因不是模块不存在,而是 Go 默认使用官方 proxy https://proxy.golang.org,该地址在国内多数情况下不可达或超时。即使 GO111MODULE=on 已启用模块模式,若未显式设置 GOPROXY,Go 仍会尝试访问这个不可用地址,最终 fallback 到直接 git clone,而很多模块仓库(如 GitHub)同样受阻。
- 验证方式:运行
go env GOPROXY,若输出为空或为https://proxy.golang.org,direct,即为风险状态 - 直接执行
go mod download时出现Get "https://proxy.golang.org/...": dial tcp: i/o timeout就是典型表现 - 注意:
direct在GOPROXY链中表示“失败后退回到直连”,但直连往往也失败,导致整体失败
国内可用的稳定 Go Proxy 地址及推荐组合
单一代理存在单点故障或同步延迟问题,建议采用「主备+fallback」策略。目前最可靠的是清华和七牛双源组合:
- 清华镜像:
https://mirrors.tuna.tsinghua.edu.cn/go(响应快、同步及时、长期稳定) - 七牛云:
https://goproxy.cn(支持私有模块代理,对国内用户友好) - 推荐配置命令:
go env -w GOPROXY=https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/go,direct - 注意顺序:Go 按逗号分隔顺序尝试,
direct必须放在末尾,否则会跳过代理直接走 git
GOPRIVATE 和 GONOPROXY 什么时候必须设?
当项目引用了私有 Git 仓库(如公司内网 GitLab、GitHub Private Repo)或非标准域名模块时,Go Proxy 会拒绝代理这些路径——因为默认只代理公开模块。此时必须显式声明哪些路径不走代理。
立即学习“go语言免费学习笔记(深入)”;
- 例如模块路径为
git.example.com/internal/utils,需设置:go env -w GOPRIVATE=git.example.com/internal -
GOPRIVATE是更现代、推荐的方式;GONOPROXY功能相同但已逐步被替代,二者不要混用 - 多个域名用逗号分隔,支持通配符:
go env -w GOPRIVATE="git.example.com/*,github.com/my-org/private-*" - 一旦设置了
GOPRIVATE,对应路径下的模块将完全绕过GOPROXY,改用git clone或svn export等原生方式获取,因此确保这些地址本身可访问
CI/CD 中配置 Go Proxy 容易忽略的三个细节
本地能跑不等于流水线能跑。Docker 构建、GitHub Actions、GitLab CI 等环境常因隔离性丢失代理配置。
- 不要依赖
~/.bashrc或 shell profile —— CI 容器通常以 non-interactive 方式启动,不会加载这些文件 - 务必在构建脚本开头显式设置:
go env -w GOPROXY=https://goproxy.cn,direct,或在Dockerfile中用ENV GOPROXY=https://goproxy.cn,direct - 如果使用
go mod vendor,注意GOPROXY仍会影响vendor前的模块解析阶段;而vendor/目录本身不依赖代理,但首次生成它时离不开代理
真正棘手的不是配哪个地址,而是忘记 GOPRIVATE 导致私有模块静默失败,或在 CI 中误以为“本地 OK 就没问题”。每次新增私有依赖、切换构建环境前,都值得再检查一遍 go env | grep -E "(GOPROXY|GOPRIVATE)" 的输出。










