Go 的变量作用域

Note

本文摘录自即将出版的《Go语言趣学指南》, 请访问 gpwgcn.com 以获取更多相关信息。

变量从声明之时开始就处于 作用域 当中,换句话来说变量就是从那时开始变为可见的(visible)。 只要变量仍然存在于作用域当中,程序就可以随时访问它,然而变量一旦离开作用域,尝试继续访问它将引发错误。

变量作用域的其中一个好处是让我们可以为不同的变量重用相同的名字。 因为除了极少数小型程序之外,程序的变量几乎不可能不出现重名。

除此之外,变量作用域还能够帮助我们更好地阅读代码,让我们无需在脑海里记住所有变量。 毕竟一旦某个变量离开了作用域,我们就不必再关心它了。

Go 的作用域通常会随着大括号 {} 的出现而开启和结束。 在接下来展示的代码清单 4-1 中, main 函数开启了一个作用域,而 for 循环则开启了一个嵌套作用域。

代码清单 4-1 作用域规则: scope.go

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    var count = 0

    for count < 10 {    // 开启新的作用域
        var num = rand.Intn(10) + 1
        fmt.Println(num)

        count++
    }   // 作用域结束
}

因为 count 变量的声明位于 main 函数的 函数作用域 之内,所以它在 main 函数结束之前将一直可见。 反观 num 变量,因为它的声明位于 for 循环的作用域之内,所以它在循环结束之后便不再可见。

尝试在循环结束之后访问 num 变量将引发 Go 编译器报错。 与之相对的是,因为 count 变量的声明位于 for 循环之外,所以即使在循环结束之后,程序也可以在有需要的时候继续访问 count 变量。 另一方面,如果我们想要把 count 变量也限制在循环的作用域之内,那么就需要用到在 Go 中声明变量的另一种方式。

{速查 4-1}

  1. 变量作用域对我们有什么好处?

  2. 变量在脱离作用域之后会发生什么事情? 请修改代码清单 4-1 , 尝试在循环结束之后访问 num 变量, 看看会什么发生什么事情?

{速查 4-1 答案}

  1. 作用域可以让我们在多个不同的地方使用相同的变量名而不会引发任何冲突, 并且在编程的时候只需要考虑位于当前作用域之内的变量即可。

  2. 脱离作用域的变量将变得不可见并且无法访问。 尝试在 num 变量的作用域之外访问它将导致 Go 编译器报告以下错误: undefined: num