go mod download卡在lookup proxy.golang.org: no such host是本地DNS解析失败所致,需先验证proxy.golang.org能否解析,再检查GOPROXY设置及环境变量是否生效,最后处理sum.golang.org校验回退问题。

go mod download卡在lookup proxy.golang.org: no such host
这不是 Go 本身的问题,而是你的本地 DNS 根本查不到 proxy.golang.org。运营商 DNS(比如 114.114.114.114)可能直接返回 NXDOMAIN,或中间被劫持/缓存污染,导致 Go 工具链反复重试、无法 fallback——看起来像“死循环”。
先验证:运行 nslookup proxy.golang.org 或 dig proxy.golang.org +short,如果没输出 IP 或报 server can't find,说明 DNS 层就断了。
- 别急着改
GOPROXY——DNS 都不通,设了代理也白搭,Go 还是得先解析域名才能发请求 - 临时测试可换公共 DNS:
echo "nameserver 1.1.1.1" > /etc/resolv.conf(Linux/macOS),Windows 在网络适配器里手动填8.8.8.8 - Termux 用户注意:
$PREFIX/etc/resolv.conf才是有效路径,不是系统级/etc/resolv.conf
GOPROXY 设置正确但依然 fallback 到官方域名
Go 会严格按 GOPROXY 值顺序尝试,一旦某个代理不可达或返回非 2xx 状态,就立刻 fallback 到下一个;如果最后一个是 direct,就会直连 proxy.golang.org——此时若 DNS 仍不通,就又回到 lookup 死循环。
常见错误包括:
立即学习“go语言免费学习笔记(深入)”;
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
-
GOPROXY缺协议或尾部斜杠:goproxy.cn❌,必须是https://goproxy.cn✅ - 环境变量没生效:PowerShell 和 CMD 不互通,
$env:GOPROXY和set GOPROXY是两套环境 - CI 或 IDE 启动新进程时未继承 shell 变量,建议用
go env -w GOPROXY=https://goproxy.cn,direct写入全局配置 - 执行前加
echo $GOPROXY(macOS/Linux)或echo %GOPROXY%(CMD)确认值已加载
sum.golang.org 校验失败触发 DNS 回退
即使 GOPROXY 走通了,Go 默认仍会单独请求 sum.golang.org 做 checksum 校验。这个域名在国内基本不可达,一旦解析失败,整个 go mod download 就会卡住或报 verifying : checksum mismatch,并不断重试 DNS 查询。
稳妥解法不是关校验,而是让 sumdb 也走代理:
- 设
GOSUMDB=sum.golang.org+https://goproxy.cn/sumdb(goproxy.cn支持该路径) - 若镜像不支持 sumdb 接口(如某些私有 Athens 实例),只能设
GOSUMDB=off,但需确保私有模块可信 - 临时调试可用
go mod download -insecure,但绝不推荐长期使用
企业内网 DNS 白名单策略导致的隐性阻塞
很多公司 DNS 只放行特定域名(如 github.com),却拦掉 proxy.golang.org 或 sum.golang.org。这时 go mod download -v 日志里可能只显示 “Fetching …” 卡住,根本看不到 HTTP 请求发出——因为 DNS 查询在底层就被静默拒绝了。
验证方式:
- 用
go mod download -x查看最后一条curl命令,复制出来手动执行,观察是 DNS 失败还是 connect timeout - 在内网部署私有 proxy(如 Athens),并设
GOPROXY=http://athens.internal:3000,direct - 确认服务监听的是
0.0.0.0:3000而非127.0.0.1:3000(Docker/WSL 场景下尤其关键)
真正卡住的往往不是下载速度,而是 DNS 解析失败后 Go 工具链反复重试却不报明确错误——它不响应 Ctrl+C,直到 dial 完成,容易误判为“死锁”。

















