我很难理解为什么当我在包中有连字符时我的代码会抱怨。例如,如果我有一个包名 foo-bar 并且我声明了该包名
package foo-bar
foo-bar/config.go:1:13: expected ';', found '-'
那么为什么 Go 编译器会抱怨呢?这是否意味着我们不应该在 go 包名称中使用连字符?
由于有许多 repo 在包名称中使用连字符,我做错了吗?
我很难理解为什么当我在包中有连字符时我的代码会抱怨。例如,如果我有一个包名 foo-bar 并且我声明了该包名
package foo-bar
foo-bar/config.go:1:13: expected ';', found '-'
那么为什么 Go 编译器会抱怨呢?这是否意味着我们不应该在 go 包名称中使用连字符?
由于有许多 repo 在包名称中使用连字符,我做错了吗?
我们可以从 Go 规范中看到,包名必须是有效的标识符:
包名 = 标识符。
我们可以进一步阅读,一个有效的标识符被定义为:
标识符 = 字母 { 字母 | unicode_digit } 。
所以包名可能只包含字母和数字。 -
不允许使用字符。
我们可以进一步阅读,作为一种特殊情况,下划线字符 ( _
) 被定义为字母,用于 Go 标识符:
下划线字符 _ (U+005F) 被认为是一个字母。
因此,如果您愿意,您可以替换-
为_
您的包名称。
但是,请考虑不要这样做,因为它被认为是非惯用的。有关 Go 中包命名的建议,请阅读Effective Go关于包名称的部分,或阅读 Go 博客关于包名称的帖子。
另一种语言的典型名称风格在 Go 程序中可能不习惯。以下是两个在其他语言中可能风格不错但在 Go 中不太适合的名称示例:
- 计算服务客户端
- 优先队列
如果您的包裹地址中有-
名称,您可以使用下划线设置您的包裹名称。
例子:
包文件地址:some/where/foo-bar/config.go
package foo_bar
// your codes
虽然不直接相关,但出于某种原因,在创建项目布局时,我一直在尝试搜索是否有关于 go 模块的“路径”部分命名的规则或指南。除了Go Modules Reference中的“模块路径中允许的字符也有几个词法限制”之外,我几乎没有发现什么。我想我可以在组织目录结构时自由使用连字符。