应优先设置 goproxy 为 https://goproxy.cn,direct,因 go 1.13+ 模块代理请求不走系统网络栈,改 hosts 或防火墙无效;国内镜像兼容官方协议,设置后立即生效,且 direct 支持私有仓库回退。

Go 模块下载卡在 proxy.golang.org 或超时失败,本质不是“绕过”,而是主动指定稳定、低延迟的代理源——国内用户应优先用 goproxy.cn 或 mirrors.aliyun.com/goproxy,而非依赖系统级“本地策略”修改。
为什么改 GOPROXY 而不是调系统 hosts 或防火墙?
Go 1.13+ 默认启用模块代理(GOPROXY),所有 go get、go mod download 请求都先走 HTTP 代理,不走 DNS 或系统网络栈。改 /etc/hosts 或关防火墙对代理请求无效;强行拦截 HTTPS 流量还可能触发 x509: certificate signed by unknown authority 错误。
-
GOPROXY是 Go 工具链第一顺位控制项,优先级高于任何系统网络配置 - 国内镜像如
https://goproxy.cn支持完整语义(含@latest、@v1.2.3、/list等),和官方 proxy 协议完全兼容 - 设置后立即生效,无需重启终端或重装 Go
三步设置可靠代理(推荐 goproxy.cn)
执行以下命令即可生效(Linux/macOS):
go env -w GOPROXY=https://goproxy.cn,direct
Windows PowerShell 用户运行:
go env -w GOPROXY="https://goproxy.cn,direct"
-
direct表示当模块在代理中未命中时,回退到直接拉取(例如私有仓库),避免全链路被代理阻断 - 不要写成
https://goproxy.cn/(末尾斜杠会导致 404) - 若公司内网有自建代理,可替换为
http://your-proxy:8080,但需确保它支持 Go proxy 协议
遇到 invalid version 或 checksum mismatch 怎么办?
这类错误往往不是代理问题,而是本地缓存或校验机制冲突:
- 先清空模块缓存:
go clean -modcache - 检查
go.sum是否被手动修改过——Go 会拒绝校验失败的模块,即使代理返回正确内容 - 确认没意外设置了
GOSUMDB=off:关闭校验虽能跳过报错,但会破坏依赖完整性,不建议生产环境使用 - 如果用的是
mirrors.aliyun.com/goproxy,注意其域名已从https://mirrors.aliyun.com/goproxy/迁移至https://goproxy.aliyun.com(旧地址返回 403)
临时覆盖代理只用于单次命令
调试或验证不同源时,不必永久修改环境变量:
GOPROXY=https://goproxy.cn go mod download
或针对某个模块:
GOPROXY=https://goproxy.cn go get github.com/sirupsen/logrus@v1.9.3
- 这种写法只影响当前 shell 命令,退出后自动失效
- 适合 CI 脚本中隔离代理策略,避免污染构建环境
- 注意 Windows CMD 不支持
VAR=value cmd语法,需先set GOPROXY=...再执行
真正容易被忽略的是:代理设置后仍出现超时,大概率是本地网络出口本身限制了 HTTPS 连接(比如企业网关拦截了非标准 User-Agent),这时需要配合 GO111MODULE=on 和明确的 go mod tidy 触发完整解析,而不是反复重试 go get。











