go env goproxy输出为空或为proxy.golang.org说明代理未生效,主因是shell未重启、未source配置文件或windows powershell临时设置未持久化;正确写法为go env -w goproxy=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct,逗号分隔且direct必须在末尾。

go env GOPROXY 输出为空或仍是 proxy.golang.org 就说明代理没生效
执行 go env GOPROXY 是最直接的验证方式。如果输出是空字符串、https://proxy.golang.org 或 direct,那当前命令实际运行时根本不会走国内镜像——它要么直连失败,要么 fallback 到不可靠地址。这不是“配置了但慢”,而是压根没配对。
常见原因有三个:
- 改了 go env -w GOPROXY=... 但 shell 没重启,新终端没继承变量
- 在 ~/.zshrc 里写了 export GOPROXY=... 却忘了 source ~/.zshrc
- Windows 上用 PowerShell 临时设了 $env:GOPROXY,但 IDE(如 VS Code、GoLand)启动时读的是系统级环境变量,不是当前会话
真正生效的写法(推荐持久化):go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
注意逗号分隔、direct 必须在末尾。
多个代理用竖线 | 还是逗号 ,?Go 1.15+ 之后必须用逗号
旧教程里写的 GOPROXY="https://goproxy.cn|https://mirrors.aliyun.com/goproxy|direct" 是错的。Go 1.15 起只认英文逗号 , 分隔,竖线 | 会被整个当作一个无效 URL 处理,导致所有请求都 fallback 到 direct。
正确顺序逻辑:
- Go 按从左到右顺序尝试每个代理
- 遇到 404(比如模块刚发布还没缓存)、502/503(镜像临时不可用),才试下一个
- direct 是兜底动作,不是“代理”,而是跳过代理、直接 git clone 或 HTTP GET 原始仓库
所以推荐组合:https://goproxy.cn,https://proxy.golang.com.cn,direct
第一个快且稳定,第二个是官方中国站(偶尔抖动但语义可靠),direct 放最后保私有模块。
私有模块拉不下来?光设 GOPROXY 不够,还得配 GOPRIVATE
如果你的 go.mod 里有类似 replace example.com/internal => git@git.example.com/internal v0.0.0-20230101000000-abc123,或者依赖项域名是公司内网地址(如 git.company.internal),只设 GOPROXY 会导致两种失败:
- 404:公共代理根本不知道这个域名
- 认证泄露:万一代理转发了带 token 的请求,等于把内网凭证暴露出去
必须加这句:go env -w GOPRIVATE=git.company.internal,*.internal
支持通配符,也支持多个域名用逗号分隔。设完后,Go 工具链遇到匹配域名的模块,会自动跳过 GOPROXY,直接走本地 git 或 curl,并尊重你已配好的 ~/.netrc 或 SSH key。
顺带一提:GONOPROXY 已被弃用,优先用 GOPRIVATE。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
go mod download -x 显示 GET https://proxy.golang.org/ 就证明代理被绕过了
别只信 go env 输出。真正要看的是 Go 实际发出去的请求。加 -x 参数能打印每一步网络动作:go mod download -x github.com/spf13/cobra@v1.8.1
观察输出里最关键的几行:
- ✅ 正常:出现 GET https://goproxy.cn/github.com/spf13/cobra/@v/v1.8.1.info
- ❌ 失效:出现 GET https://proxy.golang.org/... 或 git clone https://github.com/spf13/cobra
- ⚠️ 半失效:前几行是 goproxy.cn,中间突然切回 proxy.golang.org —— 很可能是某个子模块没命中缓存,又没配好 fallback 顺序
如果看到 git clone,说明 Go 完全放弃了代理机制,大概率是 GOPRIVATE 没覆盖全,或者 go.mod 里用了 replace 但路径没对上。
代理配置本身不复杂,难的是让 Go 工具链在各种场景下都严格按预期走代理链。尤其是 direct 的位置、GOPRIVATE 的匹配精度、以及调试时看真实请求而非配置项——这三个点卡住的人最多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










