跳到主要内容

Go 语言中的作用域

· 阅读需 2 分钟
素明诚
Full stack development

宇宙块(Universe block)

宇宙块是 Go 语言中最顶层的作用域,包含了所有内置的类型和函数。

package main

import "fmt"

func main() {
var num int = len("Hello") // 使用内置函数 len
fmt.Println(num) // 使用内置包 fmt
}

在这个例子中,lenfmt 都是宇宙块的一部分,它们在任何 Go 程序中都是可用的。

包块(Package block)

包块包含了一个包内的所有 Go 源代码文本,其内定义的变量在整个包内可见。

// 文件 1: math.go
package math

var Factor int = 2

// 文件 2: double.go
package math

func Double(n int) int {
return n * Factor // 可以访问同一个包内的其他文件中定义的变量 Factor
}

在这个例子中,Factormath 包的包块中定义,可以在同一个包内的其他文件中使用。

文件块(File block)

文件块是仅限于单个文件的作用域。

// 文件: util.go
package util

var helper = "hidden" // 只在 util.go 文件中可见

func Help() string {
return helper // 只有在同一个文件中定义的函数可以访问 helper
}

这里的变量 helper 仅在定义它的文件 util.go 内可见。

"if", "for", 和 "switch" 语句块(Implicit block)

在这些控制流语句中定义的变量仅在语句块内部有效。

package main

import "fmt"

func main() {
if x := 10; x > 5 {
fmt.Println(x) // x 在这个 if 块中有效
}
// fmt.Println(x) // 这里访问 x 会报错,因为 x 的作用域仅在 if 块内
}

"switch" 或 "select" 语句中的每个子句(Implicit block)

在每个 switchselect 的子句中定义的变量仅在该子句内有效。

 package main

import "fmt"

func main() {
switch num := 5; {
case num < 10:
fmt.Println(num) // num 在这个 case 块中有效
}
// fmt.Println(num) // 这里访问 num 会报错,因为 num 的作用域仅在 switch 的 case 块内
}