7

我很难理解为什么当我在包中有连字符时我的代码会抱怨。例如,如果我有一个包名 foo-bar 并且我声明了该包名

package foo-bar

foo-bar/config.go:1:13: expected ';', found '-'

那么为什么 Go 编译器会抱怨呢?这是否意味着我们不应该在 go 包名称中使用连字符?

由于有许多 repo 在包名称中使用连字符,我做错了吗?

4

3 回答 3

19

我们可以从 Go 规范中看到,包名必须是有效的标识符:

包名 = 标识符。

我们可以进一步阅读,一个有效的标识符被定义为:

标识符 = 字母 { 字母 | unicode_digit } 。

所以包名可能只包含字母和数字。 -不允许使用字符。

我们可以进一步阅读,作为一种特殊情况,下划线字符 ( _) 被定义为字母,用于 Go 标识符:

下划线字符 _ (U+005F) 被认为是一个字母。

因此,如果您愿意,您可以替换-_您的包名称。

但是,请考虑要这样做,因为它被认为是非惯用的。有关 Go 中包命名的建议,请阅读Effective Go关于包名称的部分,或阅读 Go 博客关于包名称的帖子。

于 2020-08-17T08:09:26.880 回答
9

来自Go Package Name 博客文章

另一种语言的典型名称风格在 Go 程序中可能不习惯。以下是两个在其他语言中可能风格不错但在 Go 中不太适合的名称示例:

  • 计算服务客户端
  • 优先队列

如果您的包裹地址中有-名称,您可以使用下划线设置您的包裹名称。

例子:

包文件地址:some/where/foo-bar/config.go

package foo_bar

// your codes
于 2020-08-17T07:43:56.863 回答
0

虽然不直接相关,但出于某种原因,在创建项目布局时,我一直在尝试搜索是否有关于 go 模块的“路径”部分命名的规则或指南。除了Go Modules Reference中的“模块路径中允许的字符也有几个词法限制”之外,我几乎没有发现什么。我想我可以在组织目录结构时自由使用连字符。

于 2021-09-04T01:15:28.003 回答