Go 1.13+ 默认启用 GOPROXY, fallback 到 https://proxy.golang.org,direct,但该地址国内无法访问,导致模块下载失败;应设为 goproxy.cn 等国内镜像并永久配置环境变量。

Go 1.13+ 默认启用了模块代理(GOPROXY),国内直接使用官方代理 https://proxy.golang.org 会超时或失败,必须手动设置为可用的镜像代理。
为什么 GOPROXY 不设就拉不下包?
Go 模块下载默认走 GOPROXY,而非直接连 GitHub/GitLab。若未显式设置且 Go 版本 ≥ 1.13,它会 fallback 到 https://proxy.golang.org,direct(注意是逗号分隔)。而 proxy.golang.org 在国内无法稳定访问,导致 go mod download、go build、go run 等命令卡在 “verifying” 或直接报错:
go: github.com/some/pkg@v1.2.3: Get "https://proxy.golang.org/github.com/some/pkg/@v/v1.2.3.info": dial tcp 142.250.185.110:443: i/o timeout
这不是网络或 go mod init 的问题,是代理链第一环失效了。
推荐设置哪些 GOPROXY 值?
国内稳定、同步及时、支持 HTTPS 的主流代理有:
立即学习“go语言免费学习笔记(深入)”;
-
https://goproxy.cn(七牛云,延迟低,兼容性好) -
https://mirrors.aliyun.com/goproxy/(阿里云,企业级维护) -
https://proxy.golang.com.cn(Go 官方中国代理,需登录但免费)
建议优先用 https://goproxy.cn;如果项目对合规性要求高(如金融场景),可选阿里云地址。不要混用多个代理(除非你明确需要 fallback 行为),避免因顺序或缓存不一致引发奇怪问题。
如何永久设置 GOPROXY 环境变量?
按操作系统执行对应命令,**必须重启终端或重新加载 shell 配置**才能生效:
macOS / Linux(bash 或 zsh):
echo "export GOPROXY=https://goproxy.cn" >> ~/.zshrc && source ~/.zshrc
Windows(PowerShell):
[Environment]::SetEnvironmentVariable("GOPROXY", "https://goproxy.cn", "User")
验证是否生效:
go env GOPROXY
输出应为 https://goproxy.cn。如果仍显示 https://proxy.golang.org,direct,说明环境变量没加载成功,检查 shell 配置文件路径和是否执行了 source 或重启终端。
要不要加 direct 到 GOPROXY 后面?
可以加,但仅在特定场景下需要:
- 公司内网有私有模块仓库(如 GitLab 私有实例),且该仓库不被代理收录 → 加
,direct让 Go 对匹配的域名直连 - 想绕过代理测试某个包的真实拉取行为(调试用)
常见写法:GOPROXY=https://goproxy.cn,direct。注意逗号前后**不能有空格**,否则 Go 会解析失败并静默回退到默认值。
如果你只用公开模块,不加 ,direct 更干净 —— 所有请求都走代理,错误更明确,缓存也更可控。
真正容易忽略的是:设置了 GOPROXY 后,GOINSECURE 和 GOPRIVATE 依然要按需配置,它们不随 GOPROXY 自动生效。私有模块、HTTP 仓库、自签名证书等情况,得单独处理。










