GOPROXY必须配置多级fallback且direct置于末尾,否则go mod download会卡住或报404;私有模块需配GOPRIVATE(如git.internal.company.com)避免代理泄露凭证,并配合GOINSECURE和GONOSUMDB处理非HTTPS及校验问题。

GOPROXY 配置不对,go mod download 就会卡住或报 404 —— 不是网络问题,而是代理链没写对、direct 没放末尾、或私有模块没隔离。
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,否则代理会暴露凭证
你公司 GitLab 地址是 git.internal.company.com,但 GOPROXY 默认会把请求转发过去,可能把 token 或 SSH 密钥泄露给公共代理:
- 运行
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
代理配置生效了没?别信 shell 文件,要看 go env GOPROXY
很多人改了 ~/.zshrc 或 Windows 环境变量,却没生效,因为:
- Linux/macOS:改完要
source ~/.zshrc,且终端得新开一个;IDE(如 GoLand)可能缓存旧值,需重启 - Windows:PowerShell 里
$env:GOPROXY=...只作用于当前会话;永久设置必须走「系统属性 → 环境变量」图形界面 - 最准验证方式:直接运行
go env GOPROXY,输出应是你设的完整字符串,不是https://proxy.golang.org,direct - 如果项目下有
go.work或 IDE 启用了 workspace mode,也可能覆盖全局设置
HTTP/HTTPS 代理(HTTP_PROXY)和模块代理(GOPROXY)是两回事
别混淆:GOPROXY 控制 go mod 下载包,而 HTTP_PROXY 影响运行时 HTTP 请求(比如你的程序调第三方 API):
立即学习“go语言免费学习笔记(深入)”;
- 运行时需要代理?设环境变量:
export HTTP_PROXY=http://127.0.0.1:8080、export HTTPS_PROXY=http://127.0.0.1:8080 - 代码里也可硬编码:
http.DefaultClient.Transport = &http.Transport{Proxy: http.ProxyURL(proxyURL)} - 两者互不影响:即使
GOPROXY配对了,go run main.go发请求仍可能因没设HTTP_PROXY而失败 - 注意:某些代理(如 Clash)默认只监听
127.0.0.1,Docker 容器里要用宿主 IP(如10.0.2.2)
GOPRIVATE 和 direct 的位置是最容易被忽略的细节:漏掉前者,私有模块拉不到;放错后者,整个构建流程变慢甚至失败。


















