go语言modcache的github.com 中为什么有很多感叹号开头的文件夹

52 次阅读

本文最后更新于 2026年11月2日。

✅ 一句话结论

这是 Go mod 的大小写转义编码:大写字母被转成 !小写字母,专门用来解决 Windows 文件系统大小写不敏感冲突问题。

示例: github.com/Azure/azure-sdk-for-go → 缓存路径:github.com/!azure/azure-sdk-for-go github.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 版本后缀)。

常见疑问

  1. 能不能删这些 ! 开头文件夹? 可以。属于模块下载缓存;删了之后下次 go get / go build 会重新拉取,和 go clean -modcache 效果一样。
  2. Linux/macOS 上也会看到 ! 目录吗? 同样会!这个转义逻辑是统一的,不是 Windows 专属,go 工具包硬编码的路径规则,跨平台一致。
  3. 不是病毒、不是异常!是标准规范 golang.org/x/mod 里面的 EscapePath 函数实现,源码注释写的就是这个规则。

快速对照规则

  • A → !a
  • B → !b
  • 小写字母、数字、横杠下划线原样不动