go mod download卡住或超时,根本原因是国内无法直连proxy.golang.org和sum.golang.org,必须配置GOPROXY=https://goproxy.cn,direct并同步设置GOSUMDB(如off或sum.golang.org+镜像),否则下载或校验阶段均会失败。

为什么 go mod download 卡住或报 timeout
国内直连官方 proxy.golang.org 和 sum.golang.org 基本不可用,不是 404 就是超时。Go 1.13+ 默认启用模块代理,不配 GOPROXY 就会 fallback 到直接拉源码,而 github.com 等仓库在多数网络环境下也极不稳定。
这不是你本地网络或代码的问题,是代理链路缺失导致的必然失败。
-
GOPROXY必须设为可用的国内镜像,推荐https://goproxy.cn(稳定、同步及时、无需认证) - 别只设
GOPROXY,顺手加上GOSUMDB=off或GOSUMDB=sum.golang.org+https://goproxy.cn,否则校验阶段仍可能卡住 - 如果项目用了私有模块(如公司内部 GitLab),需用逗号拼接:
GOPROXY=https://goproxy.cn,https://goproxy.your-company.com,direct,direct是兜底项,表示对匹配不到的域名走直连
如何验证 GOPROXY 配置已生效
别只改了 ~/.bashrc 就以为完事——Shell 未重载、IDE 没继承环境变量、Docker 构建时没透传,都会让配置“看似生效实则失效”。
- 终端里执行
go env GOPROXY,输出必须是你要的地址(如https://goproxy.cn),不是空或https://proxy.golang.org - 运行
go mod download github.com/go-sql-driver/mysql@v1.14.0,成功则返回静默;失败则立刻看到错误来源域名,可反推走的是哪个代理 - VS Code 用户注意:
Go: Install/Update Tools命令默认不读 Shell 的env,需在设置里手动指定"go.gopath"和"go.toolsEnvVars",或重启 VS Code 并确保它从登录 Shell 启动
自测时绕过代理的典型场景和操作
有些测试必须确认模块是否真能从源站拉取(比如验证私有库权限、调试 checksum 不匹配),这时不能靠删 GOPROXY ——Go 会 fallback 到更慢的 direct 模式,且行为不一致。
- 临时禁用:运行命令前加前缀,如
GOPROXY=off go mod download example.com/private/pkg - 仅对某次构建禁用(Docker 场景):
RUN GOPROXY=off go build -o app . - 想强制走 direct 但保留校验:设
GOPROXY=direct GOSUMDB=sum.golang.org,适用于调试sumdb错误
Docker 构建中 GOPROXY 容易漏掉的三个位置
Dockerfile 里写了一次 ENV GOPROXY 不代表万事大吉。多阶段构建、交叉编译、CI runner 的缓存机制,都可能让代理配置在某个阶段丢失。
- 每个
FROM后的新阶段都要重新ENV,尤其builder阶段和最终alpine运行阶段不能共用一个声明 - 如果用了
go install安装工具(如golangci-lint),得在安装前就设好GOPROXY,否则工具本身下载依赖就会失败 - CI 环境(如 GitHub Actions)默认不继承宿主机 env,必须显式用
env:或with:注入,例如GO_PROXY: https://goproxy.cn
真正容易被忽略的,是 GOSUMDB 和 GOPROXY 的协同关系——代理能加速下载,但校验失败照样阻断构建;而很多人只盯着下载慢,却没检查 go.sum 文件是否被意外修改,或私有模块的 checksum 是否根本没进 sumdb。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











