GOPROXY环境变量必须显式配置才能使go get在国内正常工作,推荐设为https://goproxy.cn,direct或https://proxy.golang.org,https://goproxy.cn,direct,direct须置末位;需通过go env GOPROXY验证,避免空格等格式错误,并注意GOSUMDB校验不可随意关闭。

GOPROXY 环境变量直接决定 go get 能不能成功
国内默认直连 proxy.golang.org 基本不可用,go get 会卡住或报 timeout、no matching versions 错误。必须显式设置 GOPROXY 才能正常拉取模块。
推荐配置:使用官方镜像 + fallback 到 direct
最稳妥的方案是组合多个代理地址,并启用 direct 作为兜底。这样既保证国内模块快速下载,又避免私有模块(如公司内网 Git)因被代理拦截而失败。
-
GOPROXY=https://goproxy.cn,direct(国内常用,由七牛提供,稳定性好) -
GOPROXY=https://proxy.golang.org,https://goproxy.cn,direct(优先尝试官方,失败自动切到国内镜像) - 注意顺序:go 会从左到右依次尝试,直到第一个返回 200 或 404 的代理;
direct必须放在最后,否则私有域名不会走直连
三种设置方式及其生效范围差异
环境变量设置位置不同,影响范围也不同。本地开发建议设在 shell 配置文件里;CI/CD 中应显式注入;Docker 构建需在 Dockerfile 中用 ENV 声明。
- 临时生效:
export GOPROXY=https://goproxy.cn,direct(仅当前终端有效) - 全局持久化(Linux/macOS):
echo "export GOPROXY=https://goproxy.cn,direct" >> ~/.zshrc(或~/.bashrc),然后source加载 - Windows PowerShell:
[Environment]::SetEnvironmentVariable("GOPROXY", "https://goproxy.cn,direct", "User")
验证是否生效及常见故障点
设置后不生效?大概率是缓存或作用域问题。先确认变量值,再测试具体模块拉取行为。
立即学习“go语言免费学习笔记(深入)”;
- 检查当前值:
go env GOPROXY(不是echo $GOPROXY,因为 go 命令读的是自身解析后的结果) - 强制跳过缓存测试:
go clean -modcache && go get -v github.com/go-sql-driver/mysql@v1.7.1 - 典型故障:
GOPROXY=off会导致所有模块都走 direct,私有仓库没问题,但公共模块可能因 GOPATH 模式残留或网络问题失败;GOPROXY值末尾多了一个空格(如"https://goproxy.cn,direct ")会让 go 认为第二个代理是空字符串,直接报错
go env -w GOPROXY=https://goproxy.cn,direct go env -w GOSUMDB=sum.golang.org
代理只是解决下载问题,校验仍依赖 GOSUMDB。如果同时关掉校验(GOSUMDB=off),虽能绕过证书或网络问题,但会失去模块完整性保护——这点常被忽略,尤其在离线构建或老旧 CI 环境中硬编码 off,后续升级容易引发不可预期的依赖污染。










