正确写法是GOPROXY=https://goproxy.cn,direct,因direct作为兜底开关使私有模块回退git clone直连;多代理串联如https://goproxy.cn,https://proxy.golang.org,direct反而增加失败概率。

为什么只设 GOPROXY=https://goproxy.cn 会卡死私有模块?
因为 Go 默认把所有模块请求都发给代理,包括你公司内网的 git.corp.example.com/mylib。代理不认识这个地址,直接返回 404 或超时,go mod download 就停住不动了。
关键在末尾的 ,direct —— 它不是可选项,而是兜底开关:代理查不到就跳过,改用 git clone 直连原始地址。
- ✅ 正确写法:
go env -w GOPROXY=https://goproxy.cn,direct - ❌ 错误写法:
go env -w GOPROXY=https://goproxy.cn(私有模块全挂) - ❌ 更错写法:
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct(多代理串联反而增加失败概率)
七牛云 goproxy.cn 和阿里云 goproxy.aliyun.com 怎么选?
两者都稳定可用,但实际表现有差异:
-
goproxy.cn响应更快,同步延迟通常 GOPRIVATE 组合支持最成熟 -
goproxy.aliyun.com有时出现短暂同步滞后(比如新 tag 推送后 5–10 分钟才可见),适合对时效性要求不高的团队 - 清华源
https://mirrors.tuna.tsinghua.edu.cn/goproxy/也可靠,但路径带/goproxy/后缀容易手误漏掉
推荐起步就用 goproxy.cn,它由七牛云长期维护,HTTPS 全链路支持,且不需要额外配置就能处理校验和(GOSUMDB 默认可用)。
私有模块下载失败?大概率漏配了 GOPRIVATE
即使加了 ,direct,如果没告诉 Go 哪些是“私有域名”,它还是会尝试走代理去查 checksum,导致 checksum mismatch 或 no matching hashes 错误。
- 执行:
go env -w GOPRIVATE=git.corp.example.com,github.com/myorg/* - 支持通配符:
*.internal.company匹配所有子域名 - 多个域名用英文逗号分隔,**不能有空格**
- 配完后,Go 会自动跳过代理、校验和检查、以及 HTTPS 强制要求(除非你同时设了
GOINSECURE)
验证代理是否真生效,别只看 go env GOPROXY
输出正确 ≠ 实际走代理。真正要看的是命令执行时的网络行为:
- 运行:
go get -v github.com/sirupsen/logrus@v1.9.0,观察日志里有没有Fetching https://goproxy.cn/github.com/sirupsen/logrus/@v/v1.9.0.info - 如果看到
Fetching https://github.com/...,说明代理没起作用,回头检查GOPROXY拼写、是否被 shell 配置覆盖、或 IDE 环境变量未继承 - CI/CD 中建议显式带上:
GOPROXY=https://goproxy.cn,direct go mod tidy,避免依赖环境配置
最容易被忽略的是 ,direct 这个尾巴——它不显眼,但少了它,整个私有模块流程就断在第一步。










