首页/文章/Golang

Go module 目录为什么带 ! 感叹号?

2024-05-15
7503 分钟
...

如下图的模块存储路径:

认真一看,会发现一个神奇的现象。那就是有的文件夹名称是带 ! 感叹号的。但是包本身并没有这样命名。

如下图红框中的感叹号:

这是怎么回事,目录名乱码了吗,还是说是一种加解密的编码?

golang.org/x/mod 的官方文档下 Escaped Paths[1] 我们能够找到相关的解释。如下图:

这个问题的缘由是因为 Go 模块是从 OS 文件系统读取数据的,模块不能单纯的依靠 OS 文件系统来区分大小写,也不能依靠网络服务器去区分。

也就是说,我们无法单纯依靠文件系统将 rsc.io/QUOTErsc.io/quote 区分开来。(至少 Windows 和 macOS 是这样)

因此 Go 模块需要一种安全的转义方式,使大多数导入路径的结果保持不变,避免名称的冲突。

经过各方面的考量,Go 团队得出的安全转义的方式是:用感叹号替换每个大写字母,后面跟一个小写字母

例如:

github.com/Azure/azure-sdk-for-go ->  github.com/!azure/azure-sdk-for-go. github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus.

注:Go 模块导入路径不允许使用 ! 感叹号 ,因此无需定义如何转义 ! 感叹号。

可能会有同学想说,全转大写或小写。这样其实也是不行的,因为会出现重名的情况,直接就覆盖了。

更甚者,例如:DataDog 这个模块,它随着时间的推移改变了大小写的命名,还改了几次。因此如果你 mod 目录下有多个版本,现在这种设计下,你会有一个 !d!a!t!a-!d!o!g 和一个 !data!dog 目录。

总结来讲,Go 模块(mod)的会将路径中的大写字母转换为相应的小写字母,并在前面加上感叹号,以避免在大小写不敏感的文件系统中发生大小写冲突。也就有了这看起来那么 “奇怪” 的目录名。

感觉神奇的 Go 知识又多掌握了一个!

推荐阅读

参考资料

[1]

Escaped Paths: https://pkg.go.dev/golang.org/x/mod/module#hdr-Escaped_Paths

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
Golang2026-04-10
golang文档
1\. Go 是什么 Go 是一种 强类型、垃圾回收、原生支持并发 的编程语言。代码由 package 组成;用 module 管理依赖;可执行程序通常从 package main 的 main() 函数开始运行。Go 官方一直强调兼容性,Go 1.26 也继续保持 Go 1 的兼容承诺。 最小可运行程序: 这里你已经看到了 Go 最核心的 3 个语法点: package 声明包、import 导入包、func 声明函数。main 包里...
学习
Golang2025-07-11
Go语言strconv包:字符串和数值类型的相互转换
在实际开发中我们往往需要对一些常用的数据类型进行转换,如 string、int、int64、float 等数据类型之间的转换,Go语言中的 strconv 包为我们提供了字符串和基本数据类型之间的转换功能。 strconv 包中常用的函数包括 Atoi()、Itia()、parse 系列函数、format 系列函数、append 系列函数等,下面就来分别介绍一下。 string 与 int 类型之间的转换 字符串和整型之间的转换是我们平...
学习
Golang2025-06-11
深入理解 Go 中的 new() 和 make() 函数
在 Go 语言中, 和 是两个常用的函数,用于创建和初始化不同类型的变量。本文将深入探讨 和 的区别、使用场景以及底层实现原理。 引言 Go 中的 和 函数是用于创建和初始化变量的重要工具。 用于创建指定类型的零值变量,并返回该变量的指针。 用于创建并初始化引用类型的变量,如切片、映射和通道。 函数 函数的基本语法及用法。 创建的变量是指定类型的零值,并返回该变量的指针。 适用于创建引用类型以外的其他类型变量。 函数 函数的基本语法及用...
学习
Golang2025-06-10
Ubuntu 升级 golang 版本完美步骤
一、删除旧的版本(可选) 二、下载最新版本 三、设置环境变量 1、打开profile: 2、添加以下变量: 3、是环境立即生效 4、将环境立即生效载入脚本 先打开文件这个文件: 加入这个命令: 四、查看 go 环境变量 五、GO111MOUDLE和更改GOPROXY 六、查看 go 版本 ⚙️
学习
Golang2025-06-05
Go 自动升级依赖版本
🚀 Go 自动升级依赖版本 在 Go 语言项目中,依赖管理使用 Go Modules ( 和 )。如果想要 自动升级依赖 ,可以使用以下方法。 1\. 方式 1:升级所有依赖 🔹 作用: :升级所有 Go 依赖到最新的 次要版本(minor)或补丁版本(patch) 。 :升级所有项目内的依赖。 2\. 方式 2:升级指定依赖 🔹 作用: 只升级 这个依赖到最新版本。 如果你需要升级到 最新的主要版本(major version)...
学习
Golang2025-06-02
GO项目的打包和部署
在 Go 语言中,打包和部署应用非常简单,因为 Go 编译生成的可执行文件不依赖外部环境。以下是 打包发布和部署 Go 应用 的几种常见方式,以及一些最佳实践。 1\. 基本的打包和构建 构建可执行文件 你可以通过 命令将你的应用打包成一个可执行文件: 说明: 指定输出的可执行文件名(如果省略,输出名默认为当前目录名)。 如果没有错误,当前目录会生成一个可执行文件 (Windows 系统下是 )。 运行可执行文件: 2\. 打包不同平台...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录