【发布时间】:2025-12-17 14:00:02
【问题描述】:
Go specification to define an identifier 导出的基本原理是什么
如果两者都有:
- 标识符名称的第一个字符是 Unicode 大写字母(Unicode 类“Lu”);和
- 标识符是在包块中声明的,或者是字段名或方法名。 "
第 1 项我很清楚。
但是第 2 项的预期含义是什么?
据我所知,每个标识符都必须在包块中声明,因为 Go 不提供其他地方来声明标识符。 我也不明白为什么这句话似乎区分标识符和字段名和方法名。字段名和方法名不是标识符的例子吗?
换个方式问:我这样想是不是错了:
- 没有其他方法可以让标识符存在,除非 在包块中声明(注意a package block encompasses all package code)
- 字段名和方法名是标识符
- 标识符只能在包块中声明
- 没有在包块外声明标识符
【问题讨论】:
-
“除了在包块中声明之外,还有其他方法可以让标识符存在吗?”是的当然。例如,函数或方法中的局部变量。 "Identifiers name program entities such as variables and types." 类型也可以在函数中声明,它们不必在包块中。
-
@Peter:我认为这不是一个很好的例子。您命名的所有实体仍在“包块”中。请参阅golang.org/ref/spec#Blocks 中“包块”的定义:“每个包都有一个包块,其中包含该包的所有 Go 源文本。”
-
“Go source text”不是“所有标识符”的同义词。 "Declarations and scope" 部分详细描述了标识符如何绑定到块。例如:“5. 在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec [...] 的末尾开始,并在最里面的包含块的末尾结束。 "
-
"没有标识符可以在同一个块中声明两次。"如果您的理解是正确的,那么您永远不能两次使用相同的变量名,因为它们会在 Universe 块中发生冲突。显然不是这样的。
标签: go