根本原因是 Go 默认代理 proxy.golang.org 在国内无法稳定建立 TLS 连接或 DNS 解析失败;修复需设置 GOPROXY 为国内镜像并保留 ,direct,同时配置 GOPRIVATE 掩盖私有模块。

go mod download 卡在 proxy.golang.org 超时
根本原因是 Go 默认用 https://proxy.golang.org,direct,而这个地址在国内多数网络环境下无法稳定建立 TLS 连接或 DNS 解析失败。现象是 go mod download 或 go build 长时间卡住,最后报 context deadline exceeded 或 Get "https://proxy.golang.org/...": dial tcp: i/o timeout。
- 立即生效的修复:执行
go env -w GOPROXY=https://goproxy.cn,direct(推荐)或go env -w GOPROXY=https://mirrors.tuna.tsinghua.edu.cn/go/modules/,https://goproxy.cn,direct - 必须包含
,direct—— 否则私有模块(如gitlab.internal/project)会因 403 或 404 失败 - 验证是否写入成功:运行
go env GOPROXY,输出应严格匹配你设置的字符串,不含空格或换行 - 若仍超时,加
-v参数看具体卡在哪一步:go mod download -v;再手动复制最后一条 curl 命令执行,确认是 DNS、connect 还是 TLS 握手失败
go get 安装 gopls/dlv 等工具失败
go get 在 Go 1.16+ 已被标记为 deprecated,它默认绕过 GOPROXY 直连 golang.org/x/... 路径,而该域名在国内基本不可达。错误常表现为 Fetching https://golang.org/x/tools/gopls 卡死或 404。
- 改用
GO111MODULE=on go install替代:GO111MODULE=on go install golang.org/x/tools/gopls@latest - 如果仍失败,说明
GOPROXY没生效,或公司防火墙拦截了 HTTPS 流量——此时可临时用GOPROXY=direct go install ...绕过代理测试 - 不建议手动替换路径(如把
golang.org/x/tools改成github.com/golang/tools),因为 import 语句和 module path 必须一致,否则编译报错
私有模块拉取 403 或 “module lookup failed”
设置了 GOPROXY 但引用了内网 GitLab、GitHub 私仓或自建 Gitea,Go 仍尝试通过代理访问,导致认证失败或路径不存在。
- 必须配置
GOPRIVATE:例如go env -w GOPRIVATE="git.example.com,github.com/my-org/*" - 支持通配符,但逗号分隔时不能有空格;
*只能出现在末尾,不能写成github.com/*/repo - 若私有域名是 IP 段(如
192.168.1.100),需写成go env -w GOPRIVATE="192.168.1.100",不能省略协议或端口 - 检查是否漏配:运行
go env GOPRIVATE,确保输出包含所有私有源;若为空,说明没生效
本地自建 Athens/goproxy 服务不起作用
自己跑了个 athens 或 goproxy,但 go mod 仍超时,大概率是服务未监听对外地址或端口被拦截。
立即学习“go语言免费学习笔记(深入)”;
- 确认监听地址是
0.0.0.0:3000,不是127.0.0.1:3000—— Docker、WSL、Mac 上尤其容易出这问题 - 检查服务是否真在运行:
curl -v http://localhost:3000/healthz(或你设的地址),返回 200 才算活 - 查防火墙:
sudo ufw status(Ubuntu)或iptables -L -n | grep 3000,确保端口放行 - 若用 Docker,确认
-p 3000:3000映射正确,且容器内服务绑定的是0.0.0.0而非localhost
GOPROXY 和 GOPRIVATE 的组合是否覆盖全部模块路径——少一个域名,就可能让整条依赖链中断。


















