Go 语言中的作用域
· 阅读需 2 分钟
宇宙块(Universe block)
宇宙块是 Go 语言中最顶层的作用域,包含了所有内置的类型和函数。
package main
import "fmt"
func main() {
var num int = len("Hello") // 使用内置函数 len
fmt.Println(num) // 使用内置包 fmt
}
在这个例子中,len
和 fmt
都是宇宙块的一部分,它们在任何 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
}
在这个例子中,Factor
在 math
包的包块中定义,可以在同一个包内的其他文件中使用。
文件块(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)
在每个 switch
或 select
的子句中定义的变量仅在该子句内有效。
package main
import "fmt"
func main() {
switch num := 5; {
case num < 10:
fmt.Println(num) // num 在这个 case 块中有效
}
// fmt.Println(num) // 这里访问 num 会报错,因为 num 的作用域仅在 switch 的 case 块内
}