Go 澄清导出标识符的定义

Go 澄清导出标识符的定义,go,Go,出口商品的基本原理是什么 如果两者都有: 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);及 标识符在包块中声明,或者是字段名或方法名。" 第1项我很清楚 但第2项的预期含义是什么 据我所知,每个标识符都必须在包块中声明,因为Go不提供其他位置来声明标识符。 我也不明白为什么这句话似乎在区分标识符、字段名和方法名。字段名和方法名不是标识符的例子吗 换一种方式问:我是否错误地认为: 除此之外,标识符没有其他存在方式 正在包块中声明(注意) 字段名和方法名是标识符 标识符

出口商品的基本原理是什么

如果两者都有:

  • 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);及
  • 标识符在包块中声明,或者是字段名或方法名。"
  • 第1项我很清楚

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

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

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

  • 除此之外,标识符没有其他存在方式 正在包块中声明(注意)
  • 字段名和方法名是标识符
  • 标识符只能在包块中声明
  • 不能在包块外声明任何标识符

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

    如本节所述:

    字段名可以显式指定(IdentifierList)或隐式指定 (嵌入字段)

    在以下结构中:

    type s struct {
      A int
      b int
    }
    
    A
    是导出的,因为它是一个字段名,并以大写字符开头。
    b
    不是导出的,因为它是一个字段名,但不以大写字符开头

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

    混淆源于这样一个事实,即您认为标识符仅在包块级别:它们不是。

    1。除了在包块中声明之外,没有其他方法可以使标识符存在 没错。您缺少的一点是标识符:

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

    这意味着在函数块内声明的标识符在此函数外将不可用

    2.字段名和方法名是标识符 正确。正如您在规范中看到的,它只是
    标识符的别名,与相同

    3.标识符只能在包块中声明 我相信这是对第一个问题的回答

    4.不能在包块外声明任何标识符
    在universe块中声明的标识符有很多种。但您不能在代码中声明包块之外的标识符。

    “除了在包块中声明之外,还有其他方法使标识符存在吗?“当然可以。例如,函数或方法中的局部变量。类型也可以在函数中声明,它们不必在包块中。@Peter:我认为这不是一个好例子。您命名的所有实体仍在“包块”中。请参阅“包块”的定义:“每个包都有一个包块,其中包含该包的所有Go源文本。”“Go源文本”并非“所有标识符”的同义词。本节详细描述如何将标识符绑定到块。例如:“5.在函数中声明的常量或变量标识符的作用域从ConstSpec或VarSpec[…]的末尾开始,并在最里面的包含块的末尾结束。”“同一块中不能声明两次标识符。”如果您的理解是正确的,则决不能两次使用同一个变量名,因为他们会在宇宙块中发生冲突。显然不是这样,谢谢你的回答。你能详细解释一下“块级”是什么意思吗?如果你指的是围绕“}”、“{”的代码块,比如“函数体”或“为/如果构造”,那么,不,我不把我的思想局限于这些。我也考虑包级变量。BTW:在你的例子结构声明中,你使用了一些块(用'}','{'分隔)。-尽管你似乎认为块级思维在这里过于狭窄。