我正在Go specification学习语言,这些要点摘自的规范Declarations and scope。
Go specification
Declarations and scope
虽然我能理解分1-4,我很困惑的点5和6:
5
6
5. 在函数内部声明的常量或变量标识符的范围始于ConstSpec或VarSpec的末尾(对于简短变量声明为ShortVarDecl),并在最里面的包含块的末尾结束。 6. 在函数内部声明的类型标识符的范围始于TypeSpec中的标识符,并终止于最里面的包含块的末尾。
这是我用来了解Go范围的代码:
package main import "fmt" func main() { x := 42 fmt.Println(x) { fmt.Println(x) y := "The test message" fmt.Println(y) } // fmt.Println(y) // outside scope of y }
据此,我理解是scope of x在main函数内,并且scope of y在后的开括号和闭括号内fmt.Println(x),并且我不能y在闭括号之外使用。
scope of x
main
scope of y
fmt.Println(x)
y
如果我理解正确,那么两点4 and 5都在说同一件事。所以我的问题是:
4 and 5
如果他们说的是同一件事,那么importance这两点是什么呢?
importance
如果它们不同,请让我知道difference吗?
difference
他们用相同的规则针对两个不同的观点提出了相同的观点:第一是关于变量和常量,第二是关于类型标识符。因此,如果您在块内声明类型,则作用域规则与在同一位置声明的变量相同。