跳到主要内容

作用域

作用域层级

作用域描述
universe预定义标识符作用域
package同一 package 内可见
file blockimport 声明引入的 package name 在当前文件内可见
block当前代码块可见

universe 作用域

  • universe scope: 预定义标识符所在作用域;
  • 预定义类型: intstringboolerror;
  • 预定义值: truefalsenil;
  • 预定义函数: makenewappendlencappanicrecover;

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 中可见;
  • 顶层声明: varconsttypefunc 属于 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)
}