go111module=on是启用go modules的前提,否则go mod命令无效、代理和私有源配置失效;goproxy控制公共依赖下载源,推荐设为https://goproxy.cn,direct;goprivate需精确配置私有域名以跳过代理和校验。

GO111MODULE=on 是前提,否则依赖源控制无效
如果 GO111MODULE 没设为 on,Go 会退回到 GOPATH 模式,go mod 命令根本不会生效,所有代理、私有源配置都形同虚设。常见症状是 go mod init 不生成文件,或 go build 报错 no required module provides package。
必须执行:go env -w GO111MODULE=on
验证:go env GO111MODULE 输出应为 on
- 别信“1.16+ 默认开启”——CI 镜像、Docker 容器、旧 shell 配置常卡在
auto模式,路径判断不可靠(比如在/tmp下初始化直接失败) -
GO111MODULE=off会彻底禁用模块机制,go get写不进go.mod,go mod tidy直接报not in a module
GOPROXY 控制公开依赖的下载源
GOPROXY 决定 Go 从哪拉取公共模块(如 github.com/xxx)。默认值 https://proxy.golang.org 在国内基本不可用,超时或返回 403 是常态。
推荐配置:go env -w GOPROXY=https://goproxy.cn,direct
-
https://goproxy.cn是国内稳定镜像,由七牛云维护,兼容性好 -
direct不是可选后缀,它表示“当代理找不到包时,回源校验”,缺了会导致私有模块或新 tag 拉取失败 - 临时覆盖某次命令:在命令前加环境变量,如
GOPROXY=https://goproxy.cn go run main.go - 禁用代理(仅调试用):
go env -w GOPROXY=direct,但需确保能直连 GitHub/GitLab
GOPRIVATE 精确豁免私有模块走代理
没配 GOPRIVATE,Go 会把 git.internal.company.com/lib/foo 当作公共包,强行走 GOPROXY,结果不是 404 就是 401,报错类似:module git.internal.company.com/lib/foo: reading .../go.mod at revision v0.1.0: 401 Unauthorized
设置方式:go env -w GOPRIVATE="git.internal.company.com,github.com/myorg"
- 支持通配符:
go env -w GOPRIVATE="*.company.com" - 多个域名用逗号分隔,**不能有空格**
- 若用 SSH 地址(如
git@company.com:lib/foo),需确保域名部分(company.com)也在GOPRIVATE列表中 - 配置后,Go 会跳过代理,直接走 Git 协议拉取,并跳过 checksum.golang.org 校验
replace 和 exclude 是最后手段,慎用
replace 和 exclude 写在 go.mod 里,属于项目级覆盖,不是环境变量控制,它们优先级高于 GOPROXY 和 GOPRIVATE。
典型场景:replace github.com/some/lib => ./local-fixexclude github.com/broken/dep v1.2.0
-
replace用于本地开发联调或 fork 替换,但 CI 构建前必须删掉,否则构建失败 -
exclude仅限临时规避严重 bug,它不解决根本问题,且可能引发间接依赖冲突 - 二者都不传递给下游模块——别人
go get你的库时,不会继承这些规则 - 用
go list -m all可确认当前实际解析的模块路径,看是否被replace覆盖
真正容易被忽略的是:GOPRIVATE 必须覆盖完整域名,而 replace 的路径必须和 import 路径完全一致——少一个字符,Go 就当它不存在。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











