根本原因是默认代理 proxy.golang.org 国内不可达,必须配置 goproxy=https://goproxy.cn,direct、gonoproxy 和 gonosumdb 三者协同生效,否则 go mod download 或 go build 会卡在 fetching 阶段并报 context deadline exceeded 或 i/o timeout。

国内环境下,go mod download 或 go build 卡住、报 context deadline exceeded 或 dial tcp: i/o timeout,根本不是 Go 本身慢,而是默认直连 proxy.golang.org 失败。配对 GOPROXY + GONOPROXY + 正确 fallback 才能真正稳定下载。
go mod download 卡在 Fetching 阶段怎么办
这不是命令没反应,是 Go 工具链正在尝试连接默认代理——而该地址在国内基本不可达。它不会快速失败,而是重试+退避,卡住几秒到几十秒很常见。
- 执行
go mod download -x查看最后一条curl命令,复制出来手动跑,确认是 DNS 解析失败、TLS 握手超时,还是 connect 被拦截 - 临时验证:加
-v参数运行go mod download -v,观察是否出现GET https://goproxy.cn/...—— 若仍见proxy.golang.org,说明GOPROXY没生效 - 别只信
go env GOPROXY输出,要确认 Shell 环境变量已继承(新开终端后记得 source ~/.bashrc 或重启 IDE 终端) - 若用 WSL 或 Docker,确保自建代理监听的是
0.0.0.0:3000而非127.0.0.1:3000
GOPROXY=https://goproxy.cn 为什么还是失败
漏掉 ,direct 是最常见错误。只设镜像站,私有模块(如 git.internal.company.com/lib)会直接 404,因为 Go 不会 fallback 到直连。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 正确写法必须是:
go env -w GOPROXY=https://goproxy.cn,direct(逗号前后不能有空格) -
direct不是可选项,是兜底必需项:它让 Go 对无法代理的模块自动改用git clone或 HTTPS 下载 - 如果公司用 Nexus/Artifactory 做私有 Go 代理,应把它放最前:
go env -w GOPROXY="http://nexus.example.com/repository/goproxy/,https://goproxy.cn,direct" - 部分教程推荐
https://goproxy.io,但该服务自 2025 年底起已停止维护,偶发 502 或 checksum mismatch,不建议新项目使用
私有仓库拉不到,403 或 unknown revision 怎么办
Go 默认仍会把私有域名发给代理,而代理无法鉴权或解析内网地址,结果就是 403、404 或 lookup failed。
- 必须设置
GONOPROXY(注意不是GOPRIVATE,后者仅影响校验,不绕过代理):go env -w GONOPROXY="git.internal.company.com,192.168.0.0/16" -
GONOSUMDB必须同步设置,且值完全一致:go env -w GONOSUMDB="git.internal.company.com,192.168.0.0/16",否则即使能拉下代码,也会在校验阶段失败退出 - 通配符不被支持,
git.internal.company.com/*无效;需写完整域名或 CIDR 段 - 若用 SSH 地址(如
git@git.internal.company.com:lib.git),GONOPROXY仍要填域名部分git.internal.company.com
go build 还是触发额外网络请求?
即使 go mod download all 成功,go build 仍可能联网——这不是配置遗漏,而是 Go 构建阶段的固有行为。
-
go mod download all只覆盖go list -m all能枚举出的模块,不包含//go:embed引用的文件、cgo依赖的系统库、或由// +buildtag 分支触发的条件导入 - 构建时若遇到未缓存的
indirect模块,仍会尝试 fetch;可用go build -v -a观察是否有新Fetching日志 - 离线构建前务必设
GOPROXY=direct和GOSUMDB=off,否则即使所有 .zip 都在本地,校验阶段仍会连sum.golang.org - replace 指向远程 URL(如
replace example.com/a => https://github.com/x/a v1.2.0)时,go mod download会跳过它——这个模块只在真正 build 时才拉,无法预下载
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










