go111module=on是模块模式的准入闸门,必须显式设置;设为off则退化至gopath模式,忽略go.mod、不生成go.sum;auto模式依赖路径判断不可靠,易误判项目上下文。

GO111MODULE=on 是现代 Go 项目依赖管理的底线,其他变量(GOPROXY、GOSUMDB、GOMODCACHE)都是围绕它生效的补充;不设这个,后续所有模块行为都不可控。
GO111MODULE 决定是否走模块路径
它不是“可选开关”,而是模块模式的准入闸门。值为 off 时,go get、go build 全部退化到 GOPATH 模式:忽略当前目录的 go.mod,硬往 $GOPATH/src 里塞代码,go.sum 不生成,版本锁定失效。
常见错误现象:
- 明明有
go.mod,执行go get github.com/sirupsen/logrus@v1.9.0却提示cannot find module providing package -
go mod tidy报错no go.mod file found,但文件明明存在——其实是当前 shell 的GO111MODULE是auto,而上层目录恰好有另一个go.mod,触发了“就近启用”逻辑,导致本项目被误判为非模块上下文
实操建议:
- 始终显式设置
GO111MODULE=on,不要依赖auto(尤其在多项目嵌套或脚本自动化场景) - 验证方式:运行
go env GO111MODULE,输出必须是on - Windows 用户注意:PowerShell 中用
$env:GO111MODULE="on",CMD 中用set GO111MODULE=on,且需确保该变量在调用go命令的同一 shell 环境中生效
GOPROXY 控制依赖拉取源头和回源策略
它只在 GO111MODULE=on 时起作用,本质是一组按顺序尝试的 URL 列表,用英文逗号分隔。默认值 https://proxy.golang.org,direct 中的 direct 不是地址,而是指令:当代理返回 404/410 时,Go 会跳过后续代理,直接向模块原始 VCS(如 GitHub)发起请求。
国内用户最常踩的坑:
- 只设
GOPROXY=https://goproxy.cn,漏掉direct,导致私有模块(如公司内网 GitLab 地址)完全无法拉取 - 把
direct写成https://direct或拼错,Go 会当作无效 URL 尝试连接,超时后才报错,耗时长且错误信息模糊 - 误以为
GOPROXY能绕过GOSUMDB校验——其实不能,校验仍会连sum.golang.org(除非也关掉GOSUMDB)
实操建议:
- 推荐配置:
GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct - 调试时临时关闭代理:
GOPROXY=off,但要注意这会禁用所有代理,包括direct回源 - 私有模块必须确保其域名能被
direct正确解析,且网络可达;若需认证,得配合git config设置凭证
GOSUMDB 和 GOMODCACHE 的分工与协作
GOSUMDB 负责校验模块内容完整性,GOMODCACHE 负责缓存已校验过的模块副本。二者不冲突,但有先后依赖:只有通过 GOSUMDB 校验的模块,才会被写入 GOMODCACHE。
典型问题场景:
- 公司内网禁用外网访问,
GOSUMDB=sum.golang.org连不上,go get卡住或报verifying github.com/xxx@v1.2.3: checksum mismatch - 手动清空
$GOMODCACHE后,go mod download重拉依赖,但没重跑校验——因为校验结果也缓存在本地($GOCACHE),不是只看GOMODCACHE - 误将
GOMODCACHE设为只读路径,go mod tidy失败并提示permission denied,但错误里不提缓存路径,容易排查偏
实操建议:
- 内网环境可设
GOSUMDB=off(不推荐长期用),或自建 sumdb 服务并指向它 -
GOMODCACHE可设为 SSD 路径提升速度,也可软链到大容量盘,但务必保证读写权限和磁盘空间充足 - 清理缓存应同时操作:
go clean -modcache(清GOMODCACHE) +go clean -cache(清GOCACHE中的校验记录)
真正容易被忽略的是:这些变量之间没有“强绑定”,但行为上存在隐式时序——GO111MODULE 开启后,GOPROXY 才参与拉取,拉取成功后 GOSUMDB 才校验,校验通过才落盘到 GOMODCACHE。任意一环断开,都会导致命令卡住、静默失败或降级到非预期行为。调试时别只盯一个变量,要顺着这条链路逐段验证。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











