go模块下载慢和超时90%以上是代理配置问题,需正确设置goproxy、gonoproxy、gosumdb三变量并验证子进程继承,其中goproxy必须含https://goproxy.cn,direct且direct置于末尾,gonoproxy与gonosumdb须成对精确配置私有域名,否则触发404或checksum mismatch。

根本不用“彻底解决”——Go模块下载慢和超时,90%以上是代理没配对、没生效、或配错顺序。只要把 GOPROXY、GONOPROXY、GOSUMDB 这三个环境变量配齐且值正确,再验证子进程真读到了,基本就不再卡在 dial tcp: i/o timeout 或 verifying 阶段。
go env -w GOPROXY=xxx,direct 为什么有时不生效
不是命令没运行,而是 Go 工具链启动子进程时没继承该变量。Shell 里执行了 go env -w GOPROXY=https://goproxy.cn,direct,但终端新开的 go mod download 进程仍读到空值或默认值。
- 验证方式:运行
go mod download -x github.com/gin-gonic/gin@v1.9.1,看日志里第一行是不是GET https://goproxy.cn/...;如果是GET https://proxy.golang.org/...,说明没生效 - VS Code、JetBrains GoLand 等 IDE 启动的
go命令,通常不读 shell 的export,必须用go env -w写入全局配置,或在 IDE 设置里显式填GOPROXY - Windows PowerShell 用户注意:
$env:GOPROXY="https://goproxy.cn,direct"只对当前会话有效,重启后丢失;必须配合go env -w -
,direct必须写在最后——它不是可选项,而是兜底行为:遇到匹配GONOPROXY的域名,就跳过代理直连;漏掉它,私有模块(如git.internal.company.com)会直接 404
私有模块拉取失败:GONOPROXY 和 GONOSUMDB 必须成对设
公司内网 Git 地址被代理转发后,要么 404,要么 checksum mismatch。这不是网络问题,是 Go 强制校验机制在起作用。
- 先设
go env -w GONOPROXY="git.internal.company.com,github.com/my-org",让 Go 绕过代理直连这些地址 - 必须同步设
go env -w GONOSUMDB="git.internal.company.com,github.com/my-org",否则 Go 仍会尝试查sum.golang.org,而该服务在国内不可达,导致校验失败 - 两个变量值必须完全一致——多一个空格、少一个域名,都会触发
checksum mismatch - 通配符只支持子域名匹配(如
*.corp.example.com),不支持路径前缀(如git.example.com/internal/*不行,得写全git.example.com/internal/lib)
go mod download -x 显示 GET https://... 但还是卡住
看到请求发出去了,不代表一定能完成。真正卡住的位置,常在 DNS 解析或 TLS 握手阶段,而 Go 默认的纯 Go DNS 解析器(netdns=go)在某些网络环境下特别慢。
- 临时强制走系统 DNS:
go env -w GODEBUG=netdns=cgo,能绕过 Go 自带解析器,对 DNS 污染严重的环境效果明显 - 如果卡在
verifying github.com/xxx@v1.2.3不动,大概率是sum.golang.org被墙,Go 在反复重试;此时GONOSUMDB就不是“可选”,而是必配项 - 刚发布的 tag(比如 v1.2.3)在
goproxy.cn上可能延迟 1–2 分钟才可见,不要立刻换源;可临时加-modcacheroot /tmp/go-mod-cache避免污染主缓存,再试 - 别信“清缓存万能论”:
go clean -modcache对 DNS/TLS 卡顿无效,只对本地哈希校验错误或版本混乱有用
go get 安装 gopls/dlv 等工具仍超时
go get 在 Go 1.16+ 已不推荐,它会绕过 GOPROXY 直连 golang.org/x/... 路径,而该域名在国内基本不可达。
- 改用
GO111MODULE=on go install golang.org/x/tools/gopls@latest,这是官方推荐方式,会尊重GOPROXY - 若仍超时,说明
GOPROXY没覆盖golang.org域名;可在GONOPROXY里加上golang.org,但更稳妥的是确保GOPROXY第一优先级代理(如https://goproxy.cn)本身已缓存该模块 - 某些 CI 环境(如 GitHub Actions)需额外声明
env:块,不能只靠go env -w,因为 runner 启动新 shell 时不自动加载用户级配置
真正容易被忽略的点,是 GOPROXY 的逗号分隔逻辑和 direct 的位置——它不是“关闭代理”,而是 fallback 规则;漏掉它,或者把它放在中间(如 https://goproxy.cn,direct,https://mirrors.aliyun.com/goproxy/),会导致后续代理完全失效。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











