作用域
作用域层级
| 作用域 | 描述 |
|---|---|
| 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 作用域
- 在函数外声明的变量、常量、类型和函数,作用域覆盖同一个包的所有文件;
package config
var Port = 8080 // 首字母大写; 包外可见
var host = "127.0.0.1" // 首字母小写; 仅包内可见
- 同一个包的其他文件可以访问该变量、常量、类型和函数;
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)
}