必须配置goprivate、goproxy含direct、gosumdb三者联动:私有域名需显式声明goprivate避免代理拦截,goproxy末尾必须含英文逗号分隔的direct,gosumdb需设为off或可信源,缺一不可且格式严禁空格或换行。

私有域名被代理拦截导致403或timeout
Go默认把所有模块请求都发往GOPROXY,包括gitlab.internal、gitea.company.com这类私有域名。一旦没配GOPRIVATE,代理会尝试转发请求,但镜像站根本无法访问内网地址,结果就是403、timeout或“repository not found”。
- 必须显式设置
GOPRIVATE,例如:go env -w GOPRIVATE="gitlab.internal,gitea.company.com" - 支持通配符,比如
go env -w GOPRIVATE="*.internal",但注意不能带空格或换行 - 验证是否生效:
go env GOPRIVATE应输出你设的值;再跑go list -m private-repo@v1.0.0看是否直连成功 - 如果用了SSH克隆路径(如
git@gitlab.internal:group/repo.git),还需确保~/.ssh/config或git config已配好密钥,否则仍会卡在认证环节
GOPROXY里漏掉direct关键字
direct不是可选后缀,是强制直连的开关。如果只写GOPROXY=https://goproxy.cn,Go会把所有请求(包括私有域名)都塞给镜像站,而镜像站没法处理内网鉴权,最终报错。
- 正确格式必须包含
direct且放在末尾:go env -w GOPROXY="https://goproxy.cn,direct" - 多个镜像用逗号分隔,
direct必须是最后一个,且前后不能有空格 - 常见错误:复制粘贴时末尾多了换行或空格,导致
go env GOPROXY输出里direct被截断——这时go mod download仍会失败 - 临时验证:运行
GOPROXY=direct go mod download,若能成功说明网络本身通,问题纯属代理配置
校验服务sum.golang.org连不上导致build中断
即使GOPROXY和GOPRIVATE都配对了,GOSUMDB默认仍会连sum.golang.org做校验。内网环境里这个地址不可达,go build就会卡住或报错“fetching sum.golang.org”。
- 开发/测试环境可关校验:
go env -w GOSUMDB=off - 生产环境需配可信源,例如:
go env -w GOSUMDB="https://goproxy.cn/sum"(前提是镜像站支持-sum模式) - CI流程中务必同时设
GOPROXY=direct和GOSUMDB=off,否则vendor目录存在也挡不住远程校验 - 检查是否误设
GOINSECURE:它只影响TLS跳过,不解决sum校验问题,还可能引入安全风险
本地缓存污染引发checksum mismatch
私有模块更新后,旧缓存里的go.sum条目和新版本不匹配,Go会拒绝加载并报verifying xxx: checksum mismatch。这不是网络问题,也不是代码被篡改。
- 优先清缓存:
go clean -modcache,再重跑go mod tidy - 检查
go.mod里是否有残留的replace规则,比如replace github.com/xxx => ./local/path却没删// indirect标记——这会让Go误算校验和 - 临时绕过单模块校验:
go get -insecure gitlab.internal/group/repo,但别设全局GOINSECURE=* - 私有模块打tag后,确保Git仓库里
go.mod文件已提交,否则go list -m会找不到版本信息
私有网环境里最常被忽略的,是direct的位置、GOPRIVATE的粒度、以及GOSUMDB和GOPROXY的联动关系——三者缺一不可,且任何一个字符错误都会让整个依赖链断裂。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











