go mod download卡在proxy.golang.org是因goproxy未生效或fallback链断裂,需确保goproxy=https://goproxy.cn,direct与gosumdb=off协同配置,并验证direct拼写正确、无空格,且goprivate已声明私有域名。

go mod download卡在proxy.golang.org不动就是死循环前兆
这不是超时重试,而是 Go 工具链反复尝试连接不可达地址、不断退避、最终 hang 住——现象是命令无输出、CPU 占用极低、几秒后突然报 dial tcp: i/o timeout 或直接卡死。根本原因是 GOPROXY 没生效或 fallback 链断裂,导致所有模块都挤在 https://proxy.golang.org 这一根线上。
验证GOPROXY是否真被go命令读到
别只信 go env GOPROXY 的输出,它只是配置项;Go 运行时可能压根没加载它。
- 执行
go mod download -x github.com/go-sql-driver/mysql@v1.15.0,观察日志里第一行是不是GET https://goproxy.cn/...或类似国内代理地址;如果出现GET https://proxy.golang.org/...,说明GOPROXY没生效 - 检查 shell 启动方式:VS Code 终端、tmux、IDE 内置终端常不读
~/.zshrc,改完go env -w GOPROXY=...后新开终端再试 - 确认没有被
GOENV覆盖:运行go env GOENV,若输出非空(如/tmp/go.env),则实际配置以该文件为准,go env -w不起作用
逗号分隔的GOPROXY列表里direct漏写或位置错
direct 不是可选后缀,而是兜底策略关键词;它必须显式出现在 GOPROXY 值末尾,且不能被空格或换行隔开。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 错误写法:
go env -w GOPROXY="https://goproxy.cn, direct"(空格导致 Go 解析失败,direct被当成无效 URL) - 正确写法:
go env -w GOPROXY=https://goproxy.cn,direct(无空格,逗号紧连) - 多级 fallback 推荐顺序:
http://nexus.internal/goproxy/,https://goproxy.cn,direct(私有代理优先,失败才切公网,最后直连) - 若项目含私有模块但
GOPRIVATE未设,即使GOPROXY正确,Go 仍会把私有域名发给第一个代理,触发 403 后不走direct,形成“卡在 403 不动”的伪死循环
GOSUMDB没关导致校验阶段二次卡死
就算 GOPROXY 下载成功,go build 或 go mod download 后续仍可能卡在 verifying ...: checksum mismatch 或静默等待 sum.golang.org,这是 GOSUMDB 在后台偷偷发起校验请求。
- 开发/测试环境最简方案:
go env -w GOSUMDB=off(彻底禁用远程校验) - 生产环境需保留校验:必须配可信源,例如
go env -w GOSUMDB=sum.golang.org+replace=https://goproxy.cn/sum(注意路径必须带/sum) - CI 构建机务必同时设:
GOPROXY=direct GOSUMDB=off(仅靠GOPROXY=direct不够,GOSUMDB仍会连sum.golang.org) - 验证是否生效:运行
go env GOSUMDB,输出不能是空或sum.golang.org
真正容易被忽略的是:GOPROXY 和 GOSUMDB 必须协同生效,单点配置只解决一半问题;而 direct 的拼写、位置、与 GOPRIVATE 的配合,才是打破死循环的关键开关。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










