根本原因不是网络差或代码错,而是goproxy未正确配置fallback(必须含,direct)、未设置goprivate绕过私有域,导致go mod download卡在fetch阶段;90%的dial tcp: i/o timeout源于proxy.golang.org不可达且无降级机制。

根本不是网络差或代码写错了,而是 GOPROXY 没配对、没 fallback、没绕过私有域——Go 工具链卡在 fetch 阶段时,90% 是代理链断了。
go mod download 卡住或报 dial tcp: i/o timeout
这是最典型的症状,背后几乎全是 proxy.golang.org 不可达导致的。Go 默认用它拉包,但该地址在国内多数 DNS 解析失败或 TLS 握手超时,且不会快速失败,而是重试几十秒才报错。
- 先验证:运行
go env GOPROXY,如果输出是https://proxy.golang.org,direct,就确认是它的问题 - 别只改配置就完事——必须加
,direct,漏掉会导致私有模块直接 404 - 清华源结尾必须带
/(https://mirrors.tuna.tsinghua.edu.cn/go/modules/),而goproxy.cn不需要 - 执行
go mod download -x github.com/gin-gonic/gin@v1.9.1,观察日志里是否真发出了请求、是否 fallback 到第二项
GOPROXY 配了还是 403 或 module lookup failed
说明私有模块被错误地扔给了公共代理。Go 不会自动识别“这是内网地址”,它照常转发,结果代理无权限、无路由、无鉴权,返回 403 或 404。
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
- 必须设
GOPRIVATE(不是GONOPROXY,后者是旧名,部分 Go 版本已弃用):go env -w GOPRIVATE="git.internal.company.com,github.com/my-org/*" - 通配符生效规则是前缀匹配:
github.com/my-org/private匹配,github.com/my-org-public不匹配 - SSH 地址(如
git@git.internal.company.com:lib)也按 host 解析,所以GOPRIVATE写git.internal.company.com就够 -
GOPRIVATE设置后,对应模块改走git clone或 HTTPS 直连,确保~/.gitconfig里有可用的 credential helper
go get 仍走 GOPATH 或完全不拉新包
模块模式没开,所有代理配置都白搭。Go 1.13+ 默认启用 Modules,但某些终端、IDE 或旧项目环境里 GO111MODULE 可能仍是 auto 或 off。
- 运行
go env GO111MODULE,输出必须是on;如果不是,执行go env -w GO111MODULE=on - 项目路径不能含中文、空格或符号(如
~/Desktop/我的项目),否则go mod init失败,模块逻辑不触发 - 改完环境变量后,必须关掉所有终端再重开——IDE 内置 Terminal 通常不继承新 shell 的 PATH 和 env
- 缓存可能骗你:
go list -m all成功不代表真下载了,要用go mod download -x强制触网
混合场景下 fallback 完全失效
公有模块走镜像、私有模块走内网、本地 replace 要生效——三者同时存在时,最容易翻车的是顺序和边界。
- 代理链顺序很重要:公司内网 proxy 必须放最前,比如
go env -w GOPROXY="http://nexus.example.com/goproxy/,https://goproxy.cn,direct" -
replace只在go.mod中路径完全一致时生效(大小写、斜杠、版本号格式都不能差) -
exclude不影响go mod download,它照样去 proxy 拉被 exclude 的模块,只是构建时不参与依赖解析 - 调试时可临时用
GOPROXY=direct go mod download看是否纯网络问题;再换GOPROXY=https://goproxy.cn go mod download对比行为
真正麻烦的永远不是单点配置,而是 fallback 链中某一级静默失败(比如 DNS 缓存了 503 响应)、私有域名匹配不全、或者 IDE 终端没加载新 env——这些地方一漏,整个下载流程就卡死,还查不出原因。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










