作用域
Go 的作用域层级有哪些?
| 作用域 | 描述 |
|---|---|
| universe | 预定义标识符作用域 |
| package | 同一 package 内可见 |
| file block | import 声明引入的 package name 在当前文件内可见 |
| block | 当前代码块可见 |
universe 作用域包含哪些预定义类型, 值与函数?
- universe scope: 预定义标识符所在作用域;
- 预定义类型:
int,string,bool,error; - 预定义值:
true,false,nil; - 预定义函数:
make,new,append,len,cap,panic,recover;
包级声明如何在同一个包的多个文件间共享?
- 包级作用域: 在函数外顶层声明的变量、常量、类型和函数可由同包文件使用;
package config
var Port = 8080 // 首字母大写; 包外可见
var host = "127.0.0.1" // 首字母小写; 仅包内可见
- 跨文件访问: 下列函数可放在同包的另一个文件中,直接访问
Port;
package config
func PrintPort() {
println(Port)
}
file block 作用域是什么, 顶层声明为何不是文件私有?
- file block: 当前源文件的顶层块;
- import package name: 只在当前文件的 file block 中可见;
- 顶层声明:
var,const,type,func属于 package scope, 不是文件私有;
import f "fmt" // f 只在当前文件可见
block 作用域内变量的可见范围是什么?
- 块作用域: 局部变量从声明完成后可见,直到所在块结束;
- 内层可以访问外层,外层不能反过来访问内层局部变量;
func main() {
x := 1
if x > 0 {
y := 2 // y 只在 if 块内部可见
println(x, y)
}
}
变量遮蔽是什么, 有什么风险与处理方式?
- shadowing: 内层作用域声明同名变量, 遮蔽外层变量;
- 风险: 易误以为修改了外层变量;
- 处理方式: 对关键变量避免重复命名;
package main
var name = "package"
func main() {
name := "local" // 声明局部 name; 遮蔽包级 name
println(name)
}