为了账号安全,请及时绑定邮箱和手机立即绑定

明确导出标识符的定义

明确导出标识符的定义

Go
胡说叔叔 2022-07-11 15:10:55
Go 规范将标识符定义为导出的基本原理是什么如果两者:标识符名称的第一个字符是 Unicode 大写字母(Unicode 类“Lu”);和标识符在包块中声明,或者它是字段名或方法名。"第 1 项对我来说很清楚。但是第 2 项的预期含义是什么。 ?据我了解,每个标识符都必须在包块中声明,因为 Go 不提供其他地方来声明标识符。我也不明白为什么这句话似乎区分标识符和字段名和方法名。字段名称和方法名称不是标识符的示例吗?换个方式问:我是否错误地认为:除了在包块中声明外,没有其他方法可以存在标识符(请注意,包块包含所有包代码)字段名和方法名是标识符标识符只能在包块中声明没有在包块之外声明标识符
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

标识符包括结构字段名称和方法名称。

结构类型部分所述:

字段名称可以显式指定 (IdentifierList) 或隐式指定 (EmbeddedField)

在以下结构中:

type s struct {
  A int
  b int
  }

A被导出,因为它是一个字段名称并以大写字符开头。b不是,因为它是一个字段名,但不以大写字符开头。

方法名称也是如此(例如:(_ s) DoA()vs (_ s) doB())。

混淆源于您认为标识符仅位于包块级别的事实:它们不是。


查看完整回答
反对 回复 2022-07-11
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

1. 除了在包块中声明之外,没有其他方法可以使标识符存在

确实如此。您缺少的一件事是标识符的范围:

在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,到最里面的包含块的末尾结束

这意味着在功能块内声明的标识符在此功能之外将不可用。

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

真的。正如您在规范中看到的,MethodName只是 的别名identifier,与字段名称相同。

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

我相信这是通过回答第一个问题来解决的。

4. 不能在包块外声明标识符

在Universe 块中声明了预先声明的标识符。但是您不能在代码中的包块之外声明标识符。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信