最直接的办法是执行 go env goproxy,若输出为空、direct 或 https://proxy.golang.org,则代理未生效;再运行 go list -m -u github.com/gorilla/mux 观察是否超时或请求 proxy.golang.org,可进一步验证代理链路是否通畅。

怎么确认 GOPROXY 当前是否生效
最直接的办法是执行 go env GOPROXY。如果输出为空、direct 或 https://proxy.golang.org,基本可以判定当前没走有效代理——尤其在国内,https://proxy.golang.org 常因网络策略超时或连接拒绝。
进一步验证:运行 go list -m -u github.com/gorilla/mux。若卡住超过 10 秒、报 dial tcp: i/o timeout 或 Get "https://proxy.golang.org/...": context deadline exceeded,说明代理链路不通。
-
go env GOPROXY输出必须是以https://开头的地址,http://会被 Go 忽略 - 多个代理用英文逗号分隔,Go 按顺序尝试,
direct应放在末尾作兜底,不能省略(否则私有模块会失败) - 别依赖终端里 echo $GOPROXY 的结果,
go env才是真实生效值
怎么对比几个主流代理的实际响应速度
不用写脚本,用 curl -o /dev/null -s -w '%{time_total}\n' -L 测单个代理的模块元数据响应时间即可。例如:
curl -o /dev/null -s -w '%{time_total}\n' -L 'https://goproxy.cn/github.com/gorilla/mux/@v/list'
curl -o /dev/null -s -w '%{time_total}\n' -L 'https://mirrors.aliyun.com/goproxy/github.com/gorilla/mux/@v/list'
curl -o /dev/null -s -w '%{time_total}\n' -L 'https://proxy.golang.com.cn/github.com/gorilla/mux/@v/list'
注意:@v/list 是 Go proxy 协议标准端点,返回该模块所有可用版本,轻量且具代表性。实测中,goproxy.cn 和 mirrors.aliyun.com/goproxy 多数情况下在 0.2–0.6 秒之间,proxy.golang.com.cn 偶尔出现 2 秒以上延迟或 503。
- 别测根路径(如
/),那不反映模块服务真实性能 - 避免用
ping,Go proxy 走 HTTPS,ICMP 不代表 TLS 握手和后端响应快慢 - 公司内网环境建议加
-x http://your-corp-proxy:port测试穿透效果
怎么判断是否要配 GONOPROXY/GONOSUMDB
如果你的项目 import 了类似 git.internal.company.com/my/lib 或 github.com/my-org/private-repo 这类非公开地址,go get 会直接失败(404 或 unauthorized),哪怕 GOPROXY 设对了也没用。
此时必须显式排除:
go env -w GONOPROXY="git.internal.company.com,github.com/my-org" go env -w GONOSUMDB="git.internal.company.com,github.com/my-org"
这两个变量值必须完全一致,否则 Go 会拒绝拉取——因为校验机制要求:被跳过代理的模块,也得跳过 checksum 校验,否则矛盾。
- 不支持通配符,
github.com/my-org/*无效,只能写具体域名或路径前缀 - 如果已用
direct作兜底,GONOPROXY可省略,但GONOSUMDB仍需设置,否则go mod download会卡在校验环节 - 私有模块路径一旦出现在
go.mod中,就必须进这两个列表,漏一个就会中断构建
怎么验证换完代理后真的变快了
别只看 go get 是否成功,重点观察 go mod download 的耗时变化。执行前先清缓存避免干扰:go clean -modcache,再跑:
time go mod download -x
输出里每行带 download 的日志会显示实际下载 URL 和耗时。你会明显看到:原来卡在 proxy.golang.org 的请求,现在落在 goproxy.cn 上,单模块平均耗时从 8–15 秒降到 0.3–1.2 秒。
- 加
-x参数才能看到真实下载路径和耗时,仅go mod download不输出细节 - 首次下载会触发 checksum 查询,所以第一次仍稍慢;第二次起才是纯缓存命中,速度才真正体现代理价值
- 如果
go mod download仍慢,检查是否漏设GOSUMDB=sum.golang.org——校验服务器不可达也会拖慢整体流程
GONOSUMDB 和 GOSUMDB 的协同关系:前者跳过校验,后者强制启用远程校验,二者作用相反,但必须按场景主动选择,不能靠默认值蒙混过关。











