go get 卡在 resolving 或 downloading 的根本原因是默认直连导致代理/git协议被阻断或dns污染;需检查goproxy配置、git url映射及goprivate白名单,并用 go get -v -x 定位具体失败环节。

go get 为什么总卡在 resolving... 或 downloading...
根本原因是 go get 默认走直连,而 Go 模块代理(GOPROXY)和 Git 协议(尤其是 git:// 或 SSH)在国内常被阻断或限速。不是网络慢,是连接被重置或 DNS 污染导致握手失败。
常见错误现象:go get: module github.com/some/pkg: Get "https://proxy.golang.org/...": dial tcp 216.239.37.1:443: i/o timeout,或卡在 Cloning into '/tmp/...'... 不动。
- 优先确认是否启用了模块代理:运行
go env GOPROXY,非空且含https://goproxy.cn或https://mirrors.aliyun.com/goproxy/才算生效 - 若用
go install安装命令行工具(如gofumpt),必须加@latest后缀,否则可能 fallback 到 git clone,绕过代理 - 私有仓库(如公司内网 GitLab)必须显式配置
git config --global url."https://gitlab.example.com/".insteadOf "git@gitlab.example.com:",否则 SSH 地址会直连失败
Git 配置不匹配导致 go get 拒绝克隆
go get 在代理失效时会退回到 git clone,此时 Git 自身的协议、host 和凭证配置就直接决定成败。很多超时其实不是 Go 的问题,是 Git 连不上。
典型表现:fatal: unable to access 'https://github.com/xxx/yyy/': Failed to connect to github.com port 443: Connection refused,但浏览器能打开 GitHub —— 说明是 Git 的 HTTPS 请求被劫持或 DNS 解析异常。
- 强制 Git 走 HTTPS(禁用 git://):
git config --global url."https://".insteadOf git:// - 修复 GitHub 域名解析:
git config --global url."https://github.com/".insteadOf "git@github.com:",避免 SSH fallback - 若公司用自签名证书,需设
git config --global http.sslVerify false(仅限内网可信环境)
GOPROXY 和 GOPRIVATE 怎么配合才不冲突
设了 GOPROXY 后,私有模块仍可能超时,是因为 Go 默认把所有域名都扔给代理;一旦代理不认识你的私有域名,就会返回 404 或超时,而不是回退到本地 git。
关键点:GOPRIVATE 不是“跳过代理”,而是“不发请求给代理,直接走 git clone”。所以它必须和 Git 配置联动才有效。
- 设置私有域名白名单:
go env -w GOPRIVATE="gitlab.example.com,*.internal.company"(支持通配符) - 确保对应域名已通过
git config url."https://gitlab.example.com/".insteadOf映射为 HTTPS 地址 - 不要把
GOPRIVATE设成*:这会让所有模块都绕过代理,包括公开包,反而更慢且易失败
临时调试:怎么快速定位是哪一环挂了
别猜,用 go get -v -x 看完整流程。输出里会明确写出当前在走 proxy 还是 git,以及具体请求地址。
重点关注三类日志行:Fetching https://proxy.golang.org/...(代理请求)、Cloning into '/tmp/...(git 克隆)、git ls-remote -q https://...(git 探测远程)。
- 如果看到
Fetching https://proxy.golang.org/...后超时,说明代理不可达,换一个或检查网络出口 - 如果看到
Cloning into但卡住,立刻 Ctrl+C,然后手动执行日志里的git clone https://...命令,复现并调试 Git 配置 - Windows 用户注意:PowerShell 中
$env:GOPROXY设置后需重启终端,cmd 则用set GOPROXY=...且仅当前窗口生效
最麻烦的其实是 Git 和 Go 环境变量在不同 shell 间不一致,比如 zsh 里设了 GOPROXY,但 VS Code 终端开的是 bash 就没继承——这种隐性不一致比代理本身更难排查。










