作用域

声明和作用域

https://golang.org/ref/spec#Declarations_and_scope

已声明的标识符的作用域是源代码文本的范围,其中标识符表示指定的常量、类型、变量、函数、标签或包。

Go在词法上使用块来限定范围

  1. 预先声明的标识符的范围是 universe block / 宇宙块。
  2. 表示在顶层(在任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的作用域是 package block / 包块。
  3. 导入包的包名的作用域是包含导入声明的文件的文件块。
  4. 表示方法接收者、函数参数或结果变量的标识符的作用域是函数体。
  5. 在函数内部声明的常量或变量标识符的作用域从 ConstSpec 或 VarSpec(ShortVarDecl为短变量声明)的末尾开始,到最内部包含块的末尾结束。
  6. 在函数中声明的类型标识符的作用域从 TypeSpec中 的标识符开始,到最内部包含块的末尾。

在一个块中声明的标识符可以在一个内部块中重新声明。当在内部声明的标识符范围内时,它表示内部声明所声明的实体。

package clause / 包子句不是声明;包名不出现在任何作用域中。它的目的是识别属于同一包的文件,并为导入声明指定默认的包名。