明确导出标识符的定义

Go 规范将标识符定义为导出的基本原理是什么

如果两者:

  1. 标识符名称的第一个字符是 Unicode 大写字母(Unicode 类“Lu”);和

  2. 标识符在包块中声明,或者它是字段名或方法名。"

第 1 项对我来说很清楚。

但是第 2 项的预期含义是什么。 ?

据我了解,每个标识符都必须在包块中声明,因为 Go 不提供其他地方来声明标识符。我也不明白为什么这句话似乎区分标识符和字段名和方法名。字段名称和方法名称不是标识符的示例吗?

换个方式问:我是否错误地认为:

  1. 除了在包块中声明外,没有其他方法可以存在标识符(请注意,包块包含所有包代码

  2. 字段名和方法名是标识符

  3. 标识符只能在包块中声明

  4. 没有在包块之外声明标识符


胡说叔叔
浏览 133回答 2
2回答

明月笑刀无情

标识符包括结构字段名称和方法名称。如结构类型部分所述:字段名称可以显式指定 (IdentifierList) 或隐式指定 (EmbeddedField)在以下结构中:type s struct {   A int   b int   }A被导出,因为它是一个字段名称并以大写字符开头。b不是,因为它是一个字段名,但不以大写字符开头。方法名称也是如此(例如:(_ s) DoA()vs (_ s) doB())。混淆源于您认为标识符仅位于包块级别的事实:它们不是。

开心每一天1111

1. 除了在包块中声明之外,没有其他方法可以使标识符存在确实如此。您缺少的一件事是标识符的范围:在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,到最里面的包含块的末尾结束这意味着在功能块内声明的标识符在此功能之外将不可用。2.字段名和方法名是标识符真的。正如您在规范中看到的,MethodName只是 的别名identifier,与字段名称相同。3. 标识符只能在包块中声明我相信这是通过回答第一个问题来解决的。4. 不能在包块外声明标识符在Universe 块中声明了预先声明的标识符。但是您不能在代码中的包块之外声明标识符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go