根本原因是Go默认代理proxy.golang.org在国内遭中间设备主动拦截或限速,导致TLS握手后连接被重置;应设GOPROXY=https://goproxy.cn,direct并配GOINSECURE(私有HTTP/HTTPS时)和GOPRIVATE(私有模块路径),GOSUMDB=off仅调试用。

为什么 go mod download 总是报 connection reset?
根本原因不是网络“不稳定”,而是 Go 默认走官方 proxy(proxy.golang.org)在国内被中间设备主动拦截或限速,TCP 连接在 TLS 握手后、传输模块数据时被重置,表现为 read: connection reset by peer 或卡在某个 module 卡住不动。
这不是你本地网络的问题,也不是 GOPROXY 配置为空导致的 fallback 失败——即使你设了代理,Go 1.13+ 仍可能因 GOINSECURE 或证书校验失败回退到直连,触发重置。
怎么快速验证并切换国内可信代理?
执行这条命令看当前生效的 proxy:
go env GOPROXY
如果输出是 https://proxy.golang.org,direct 或空值,基本就是问题源头。换成清华或七牛的镜像:
立即学习“go语言免费学习笔记(深入)”;
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
- 临时生效:
go env -w GOPROXY=https://goproxy.cn,direct - 永久生效(推荐):
go env -w GOPROXY=https://goproxy.io,direct(注意:goproxy.io 已停更,优先用https://goproxy.cn或https://mirrors.aliyun.com/goproxy/) - 若项目含私有模块,必须保留
direct在末尾,否则私有域名无法直连
别漏掉 GOINSECURE——如果私有仓库用的是 HTTP 或自签名 HTTPS,得补上:go env -w GOINSECURE="git.internal.company.com"
go mod download 仍失败?检查这几个隐藏开关
Go 1.21+ 引入了 GOPRIVATE 自动匹配逻辑,但旧版本不会自动 fallback。常见陷阱:
-
GOPRIVATE没配全:比如模块路径是git.internal.company.com/group/repo,只配git.internal.company.com不够,得加通配符git.internal.company.com/* -
GOSUMDB=off临时关闭校验可绕过证书/网络问题,但仅用于调试:go env -w GOSUMDB=off - 公司防火墙会劫持 HTTPS 响应,导致
go mod download收到 HTML 页面而非 JSON,报错类似unexpected status code 200——此时必须配GOINSECURE+GOPRIVATE双保险
CI 环境下怎么稳定跑过 go mod download?
GitHub Actions / GitLab CI 经常复现此问题,因为默认环境没预设 GOPROXY。别依赖全局 go env -w,直接在脚本里导出:
export GOPROXY=https://goproxy.cn,direct<br>export GOPRIVATE=git.internal.company.com/*<br>go mod download
注意两点:
- 不要用
go env -w写入 CI 的 $HOME,不同 step 可能不共享 go env 状态 - 某些 CI 镜像自带 GOPROXY=
https://proxy.golang.org,必须显式覆盖,否则无效
最易被忽略的点:Goproxy 镜像本身也有缓存延迟,刚发布的 tag 可能在 5–10 分钟后才同步。遇到 “module not found” 先等几分钟再重试,别急着切 direct。

















