go proxy环境变量设置需验证生效:运行go env goproxy查看当前值;linux/macos写入~/.zshrc并source,windows需图形界面永久设置;代理链中direct必须置末尾;私有模块需配合goprivate和replace。

Go proxy 环境变量设置是否生效?先看 go env 输出
Go 1.13+ 默认启用 GOPROXY,但很多人改了环境变量却没生效,根本原因是没刷新或被其他配置覆盖。运行 go env GOPROXY 直接查当前值,别只改 shell 配置就以为完事。
- Linux/macOS:在
~/.bashrc或~/.zshrc中写export GOPROXY=https://goproxy.cn,direct,然后执行source ~/.zshrc - Windows(PowerShell):用
$env:GOPROXY="https://goproxy.cn,direct",注意这仅对当前会话有效;永久设置需通过「系统属性 → 环境变量」图形界面 - 如果项目根目录有
go.work或go.mod,某些 IDE(如 GoLand)可能读取自身缓存,重启 IDE 或执行go clean -modcache再试
多个代理怎么写?direct 放最后才起作用
Go 的代理链是顺序尝试的,遇到 404 或 50x 才 fallback 到下一个。但 direct 不是“备用代理”,而是“直连模块服务器”,它必须放在列表末尾,否则前面的代理失败后直接走 direct,失去加速意义。
- 推荐写法:
GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct - 错误写法:
GOPROXY=direct,https://goproxy.cn—— 这会导致所有请求先直连,超时后才走代理,反而更慢 - 国内用户慎用纯
https://proxy.golang.org:它在国内不稳定,且不缓存私有模块;若公司用私有仓库,必须保留direct在末尾才能拉取内部git@地址的模块
go get 报 module lookup disabled by -mod=readonly 怎么办?
这不是代理问题,而是 Go 模块模式限制导致的假性失败。当你在已有 go.mod 的项目里执行 go get,而 GO111MODULE 是 on 且未显式允许修改,就会卡住。
- 临时解决:加
-d参数只下载不写入,例如go get -d github.com/gin-gonic/gin@v1.9.1 - 真正要更新依赖并写入
go.mod,得用go get -u或先设go mod edit -require,但更稳妥的是直接改go.mod后执行go mod tidy - 检查当前模式:
go env GO111MODULE应为on;若为auto,在非 GOPATH 路径下也可能触发旧逻辑
私有模块 + 代理共存时,replace 和 GOPRIVATE 缺一不可
代理默认会尝试转发所有模块请求,包括你公司内网的 gitlab.example.com/mylib。不加控制,它要么 404,要么把认证信息暴露给公共代理。
立即学习“go语言免费学习笔记(深入)”;
- 必须设置
GOPRIVATE=gitlab.example.com(支持通配符,如*.example.com),这样 Go 才跳过代理直连 - 若私有库走 SSH(
git@gitlab.example.com),还需配~/.netrc或git config --global url."ssh://git@gitlab.example.com".insteadOf "https://gitlab.example.com" -
replace只影响构建时路径替换,不影响下载源;它不能替代GOPRIVATE,两者用途完全不同
GOPRIVATE 和 direct 的位置——它们不出错,但一出错就很难定位。










