跳到主要内容

作用域

Go 的作用域层级有哪些?​

作用域描述
universe预定义标识符作用域
package同一 package 内可见
file blockimport 声明引入的 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)
}