执行 go env -w GOPROXY= 后仍不走代理,根本原因是 GOPRIVATE 机制优先级高于 GOPROXY,若其值非空(如匹配私有域名),Go 会绕过代理直连源站;应使用 go env -u GOPRIVATE 清除并确认 GOPROXY 已生效。

go env -w GOPROXY= 后为什么还不走代理?
常见现象是执行 go env -w GOPROXY=https://goproxy.cn 后,go get 依然卡在 proxy.golang.org 或超时。根本原因不是命令没生效,而是 Go 1.13+ 默认启用了 GOPRIVATE 机制——只要模块路径匹配 GOPRIVATE 列表里的前缀,Go 就会跳过代理直接走源站(比如 GitHub),且不校验证书。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 检查当前值:
go env GOPRIVATE,如果输出非空(如gitlab.example.com或通配符*.example.com),很可能误配了私有域名规则,导致本该走代理的公共包也被绕过 - 清空它:
go env -u GOPRIVATE(注意是-u不是-w "") - 确认
GOPROXY已生效:go env GOPROXY应输出https://goproxy.cn或逗号分隔的多个地址 - 临时验证:运行
go list -m github.com/go-sql-driver/mysql@latest,看是否快速返回版本号而非报错或卡住
goproxy.cn 和 goproxy.io 选哪个?
两者都支持七牛云加速,但行为差异直接影响稳定性。国内用户优先选 https://goproxy.cn —— 它由七牛云官方维护,CDN 节点全在国内,对 sum.golang.org 的 checksum 查询也做了镜像;而 https://goproxy.io 已于 2023 年底停止服务,目前重定向到第三方,响应慢且偶发 503。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 设为单一地址即可:
go env -w GOPROXY=https://goproxy.cn,不需要加direct或备用地址 - 不要写成
https://goproxy.cn,direct:虽然语法合法,但一旦goproxy.cn短暂不可用,Go 会 fallback 到直连,触发私有模块检测逻辑,可能引发证书错误或限流 - 若公司内网有自建 proxy,可放在前面:
go env -w GOPROXY=https://your-intranet-proxy,goproxy.cn
go mod download 报错:checksum mismatch
典型错误信息:verifying github.com/sirupsen/logrus@v1.9.3: checksum mismatch。这不是代理问题,而是本地 go.sum 文件记录的哈希与代理返回的模块内容不一致。常见于:之前用过其他代理(如 proxy.golang.org)、手动改过 go.sum、或模块作者重写了 tag。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 先确认代理是否真在工作:访问
https://goproxy.cn/github.com/sirupsen/logrus/@v/v1.9.3.info,能返回 JSON 即说明链路通 - 清理缓存:
go clean -modcache,再重新go mod download - 跳过校验(仅调试用):
go env -w GOSUMDB=off,但上线前必须关掉,否则失去依赖完整性保护 - 更安全的做法:删掉对应行的
go.sum记录,再go mod download让 Go 重新计算并写入
CI/CD 流水线里 GOPROXY 总失效?
GitHub Actions、GitLab CI 等环境常因缓存或并发导致 go env -w 不生效。本质是 Go 命令读取的是当前 shell 会话的环境变量,而 CI 脚本可能分步执行、切换用户或重置环境。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 在每条
go命令前显式指定:GOPROXY=https://goproxy.cn go mod download - Docker 构建时,在
Dockerfile中写:ENV GOPROXY=https://goproxy.cn,比go env -w更可靠 - 避免在 CI 脚本里混用
go env -w和export GOPROXY=...:前者写入go env配置文件,后者只影响当前 shell,容易冲突 - 检查 CI 日志里是否出现
GO111MODULE=off:如果项目在 GOPATH 模式下运行,GOPROXY完全不生效
最易被忽略的一点:Go 代理只影响 go mod 相关操作(download、tidy、get),不影响 go build 或 go run 的编译过程。如果下载阶段没问题,但构建时提示找不到包,大概率是 go.mod 本身没正确初始化或 replace 规则写错了。










