Go 1.13+ 多代理需用 | 分隔而非逗号,否则解析失败;推荐 GOPROXY="https://goproxy.cn|https://proxy.golang.org|direct" 并配合 GOPRIVATE 控制私有模块直连。

Go 1.13+ 默认启用 GOPROXY,但单一镜像源存在单点故障风险;直接拼接多个 URL 并用逗号分隔会失效 —— 正确做法是用 | 分隔,且顺序决定 fallback 行为。
为什么 GOPROXY=https://goproxy.io,https://proxy.golang.org 不生效
Go 的 proxy 协议规范明确要求多个代理地址必须用竖线 | 连接,不是逗号。逗号会被整个视为一个非法 URL,导致 go mod download 直接报错:invalid proxy URL。实际行为是 Go 尝试访问形如 https://goproxy.io,https://proxy.golang.org 的单个地址,必然失败。
- 逗号分隔 → 解析失败 → 模块下载中断
-
|分隔 → 依次尝试,首个返回 200/404 的代理即终止流程(404 表示模块不存在,也算“成功响应”) - 任一代理返回 5xx 或超时,才 fallback 到下一个
GOPROXY 多源配置的合法写法与顺序逻辑
环境变量值必须严格遵循 URL|URL|... 格式,且顺序影响命中路径。推荐把国内镜像放前面,公共源兜底:
export GOPROXY="https://goproxy.cn|https://proxy.golang.org|direct"
-
https://goproxy.cn:响应快、兼容性好,对私有模块支持需额外配置GOPRIVATE -
https://proxy.golang.org:官方源,延迟高但最全,不缓存私有模块 -
direct:关键词,表示跳过代理直连 origin(仅当所有代理都返回 404 时触发) - 不要写成
https://direct——direct是保留字,不是 URL
搭配 GOPRIVATE 才能真正覆盖私有模块
即使配置了多个 GOPROXY,私有仓库(如 GitHub 私有 repo、GitLab 内网地址)默认仍走代理,而代理无法认证或访问内网地址,导致 go mod download 报 module not found 或 403。
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 设置
GOPRIVATE=git.example.com,github.com/myorg/*(用逗号分隔,不是竖线) - 匹配规则支持通配符
*,但只作用于路径前缀,不支持正则 - 若同时设
GOPROXY=...|direct,匹配GOPRIVATE的模块会跳过所有代理,直连对应 Git 服务器 - 注意:SSH 地址(如
git@github.com:myorg/repo)需确保本地 SSH agent 可用,否则直连失败
验证配置是否生效的三个关键检查点
别只看 go env GOPROXY 输出,要观察真实行为:
- 运行
go mod download -x github.com/go-sql-driver/mysql@v1.7.1,查看日志中实际请求的 proxy 地址 - 故意把第一个代理 URL 改错(如
https://goproxy.cnx),再拉一个已知存在的模块,确认是否 fallback 到第二个 - 对私有模块执行
go list -m -f '{{.Dir}}' private/internal/pkg,若返回本地路径而非报错,说明GOPRIVATE和direct协同工作正常
最容易被忽略的是 GOPRIVATE 的 glob 匹配粒度 —— 它只匹配模块路径前缀,不解析域名层级,比如 github.com/myorg 不会匹配 github.com/myorg/subteam/repo,必须写成 github.com/myorg/*。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










