go 1.21+ 需配置多级 goproxy fallback(如 goproxy.cn,tsinghua.edu.cn/goproxy/,direct),direct 必须小写且居末;私有仓库须设 goprivate(支持通配符)防凭据泄露,并可选配 goinsecure/gonosumdb。

go env -w GOPROXY 必须带 fallback,不能只写一个地址
Go 1.21+ 默认 GOPROXY=https://proxy.golang.org,direct,但国内访问 https://proxy.golang.org 极不稳定,超时后不会重试,而是直接失败。你得手动覆盖为多级 fallback:
go env -w GOPROXY=https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct- 逗号分隔,不能有空格;
direct必须小写、必须在末尾 - 第一个镜像返回
404(比如模块未同步),Go 会继续试第二个;只有全部返回非网络错误(如404/503)才走到direct - 别用
https://proxy.golang.org单独兜底——它不缓存私有模块,且在国内基本不可用
GOPRIVATE 必须显式配置,否则私有仓库凭证可能泄露
如果你的依赖来自 git.internal.company.com 或 gitlab.myorg.local,不设 GOPRIVATE,Go 会把请求转发给公共代理,可能导致 token、SSH 密钥或 Basic Auth 凭据被暴露:
-
go env -w GOPRIVATE=git.internal.company.com(支持通配符,如*.company.com) - 配置后,Go 跳过代理直连该域名,且自动跳过 checksum 校验
- 若仓库走 HTTP(非 HTTPS),还需加
go env -w GOINSECURE=git.internal.company.com - 若模块没进官方 checksum DB(如内网私有包),再加
go env -w GONOSUMDB=git.internal.company.com
HTTP_PROXY 和 GOPROXY 是两回事,别混用
GOPROXY 控制 go mod download、go get 等命令如何拉取模块;而 HTTP_PROXY 影响你程序运行时发起的 net/http 请求(比如调第三方 API):
- 模块下载慢?调
GOPROXY,不是HTTP_PROXY - 程序里
http.Get失败?检查HTTP_PROXY/HTTPS_PROXY环境变量,或代码里自定义http.Transport - 两者可共存,但作用域完全不同:一个管构建期依赖,一个管运行时网络
验证代理是否生效,别信 shell 配置文件
很多人改了 ~/.zshrc 或 Windows 系统环境变量,却没生效,因为:
- Linux/macOS:改完要
source ~/.zshrc,且终端得新开一个;IDE(如 GoLand)可能缓存旧值,需重启 - Windows PowerShell:
$env:GOPROXY=...只作用于当前会话;永久设置必须走「系统属性 → 环境变量」图形界面 - 最准验证方式:
go env GOPROXY输出应是你设的完整字符串,不是默认的https://proxy.golang.org,direct - 如果项目下有
go.work或启用了 workspace mode,也可能覆盖全局设置
真正容易被忽略的是 fallback 顺序和 direct 的位置——写错一个字符(比如空格、大写 DIRECT、漏掉 direct),go mod download 就会卡住或报 404,而不是提示你配置错了。











