一尘不染

了解Go中的变量范围

go

我正在Go specification学习语言,这些要点摘自的规范Declarations and scope

虽然我能理解分1-4,我很困惑的点56

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 xmain函数内,并且scope of y在后的开括号和闭括号内fmt.Println(x),并且我不能y在闭括号之外使用。

如果我理解正确,那么两点4 and 5都在说同一件事。所以我的问题是:

  1. 如果他们说的是同一件事,那么importance这两点是什么呢?

  2. 如果它们不同,请让我知道difference吗?


阅读 319

收藏
2020-07-02

共1个答案

一尘不染

他们用相同的规则针对两个不同的观点提出了相同的观点:第一是关于变量和常量,第二是关于类型标识符。因此,如果您在块内声明类型,则作用域规则与在同一位置声明的变量相同。

2020-07-02