国内直接 go get 第三方包失败的核心原因是默认 GOPROXY=https://proxy.golang.org 在国内不可用;应配置为清华镜像+官方代理+direct 多级 fallback,私有模块还需配合 GONOSUMDB 和 GOINSECURE。
国内直接 go get 第三方包大概率失败,核心原因不是 Go 本身限制,而是模块代理(GOPROXY)默认值为 https://proxy.golang.org,该地址在国内无法稳定访问。
Go Proxy 是什么,为什么必须配
GOPROXY 是 Go 模块下载的中间代理服务,它缓存了所有公开模块的版本,并提供统一、可验证、带校验的下载入口。Go 1.13+ 默认启用模块代理机制,不配置或配置无效时,go mod download、go build、go test 等命令都会尝试走代理;若代理不可达,会 fallback 到直接 clone 源码仓库(如 GitHub),但很多仓库受网络限制或需要认证,导致失败或超时。
常见错误现象包括:
go: github.com/some/[email protected]: Get "https://proxy.golang.org/...": dial tcp 216.239.37.1:443: i/o timeoutgo: module github.com/some/pkg: git ls-remote -q origin in /tmp/gopath/pkg/mod/cache/vcs/...: exit status 128: fatal: unable to access 'https://github.com/some/pkg/': Failed to connect to github.com port 443
推荐配置方式:环境变量 + 多级 fallback
最稳妥的做法是设置 GOPROXY 为多个 URL,用逗号分隔,Go 会按顺序尝试,直到成功或全部失败。国内主流选择是清华镜像 + 官方代理兜底:
export GOPROXY=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,https://proxy.golang.org,direct
说明:
-
https://mirrors.tuna.tsinghua.edu.cn/goproxy/:响应快、同步及时、支持go list -m -json等元数据查询 -
https://proxy.golang.org:官方代理,作为二级 fallback(部分私有模块可能未被镜像收录) -
direct:表示最后 fallback 到直接拉取源码(仅限公开、可直连的仓库,比如你公司内网 GitLab 需单独配置GONOSUMDB和GOINSECURE)
注意:direct 必须小写,且不能加协议前缀;多个 proxy 之间用英文逗号分隔,**不能有空格**。
私有模块和公司内网场景怎么处理
如果项目依赖公司内部 Git 仓库(如 git.company.com/internal/pkg),仅靠 GOPROXY 不够,还需配合以下两个环境变量: