直接用goproxy=https://goproxy.cn会失败,因go工具链仅在网络连接失败(如timeout)时才fallback,404错误不触发重试;必须用逗号分隔多个镜像源并以direct结尾,如https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct。

为什么直接用 GOPROXY=https://goproxy.cn 会失败
Go 工具链在遇到 404(模块未命中)时,不会自动 fallback 到下一个代理或 direct;它只在网络连接失败(如 timeout、refused)时才尝试下一个。所以单配一个镜像源,一旦该源缓存缺失或同步延迟,go mod download 就会报错退出,典型错误:404 Not Found。
-
GOPROXY必须用逗号分隔多个地址,且direct必须放在最后 - 推荐至少两个独立镜像源,比如
https://goproxy.cn和https://mirrors.aliyun.com/goproxy/ - Go 1.21+ 默认值是
https://proxy.golang.org,direct,但国内访问proxy.golang.org极不稳定,必须显式覆盖
配置命令要区分系统和 shell 类型
Windows PowerShell、CMD 和 macOS/Linux 的 export 语法不同,写错会导致环境变量不生效。执行后务必用 go env GOPROXY 验证。
- macOS/Linux(bash/zsh):
go env -w GOPROXY="https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct" - Windows PowerShell:
go env -w GOPROXY="https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct" - Windows CMD:
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct(不要加引号) - 避免混用
export GOPROXY=...和go env -w:前者只对当前终端有效,后者写入全局配置
GOSUMDB 也要同步换国内源
校验和数据库默认是 sum.golang.org,国内访问同样慢或失败,会导致 go mod verify 或首次 go build 卡住。不能只配 GOPROXY 而忽略它。
- 推荐值:
go env -w GOSUMDB=sum.golang.google.cn - 企业内网若禁用公网校验,可设为
off,但需确保所有依赖可信(风险自担) - 若使用私有代理(如 athens),应设为
go env -w GOSUMDB=off并配合GONOSUMDB排除特定域名
私有模块和内网场景的兜底处理
当项目依赖 git.internal.company.com/mylib 这类私有仓库时,GOPROXY 无法解析,必须绕过校验和检查,否则 go get 直接拒绝下载。
- 添加私有域名到
GONOSUMDB:go env -w GONOSUMDB="git.internal.company.com/*" - 若私有仓库走 HTTP(非 HTTPS),还需加
GOINSECURE:go env -w GOINSECURE="git.internal.company.com" - CI/CD 环境中禁用
direct是硬性要求,此时必须保证所有模块都命中代理,否则构建失败
direct 不是可选项,而是保命线;而 GOSUMDB 和 GONOSUMDB 的组合,决定了你敢不敢让私有模块进流水线。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











