本文最后更新于 2026年11月2日。
✅ 一句话结论
这是 Go mod 的大小写转义编码:大写字母被转成 !小写字母,专门用来解决 Windows 文件系统大小写不敏感冲突问题。
示例:
github.com/Azure/azure-sdk-for-go→ 缓存路径:github.com/!azure/azure-sdk-for-gogithub.com/GoogleCloudPlatform/xxx→github.com/!google!cloud!platform/xxx
为什么要这么搞?
- GitHub 仓库名、module 路径是区分大小写的:
Foo和foo是两个不同模块 - Windows NTFS 默认大小写不敏感,直接建
Foo和foo两个文件夹会冲突、覆盖 - Go 官方方案:把每一个大写字母 U 写成
!u,全部变成小写路径,保证在 Windows 上不会重名,同时能无损还原回原始模块路径
这个编码只存在于
cache/download/下面(存放.zip/.info/.mod元数据); 上层pkg/mod解压目录又是另一套命名(带@v版本后缀)。
常见疑问
- 能不能删这些 ! 开头文件夹? 可以。属于模块下载缓存;删了之后下次
go get/go build会重新拉取,和go clean -modcache效果一样。 - Linux/macOS 上也会看到 ! 目录吗? 同样会!这个转义逻辑是统一的,不是 Windows 专属,go 工具包硬编码的路径规则,跨平台一致。
- 不是病毒、不是异常!是标准规范 golang.org/x/mod 里面的
EscapePath函数实现,源码注释写的就是这个规则。
快速对照规则
A→!aB→!b- 小写字母、数字、横杠下划线原样不动