【Golang】Golang 的shadowing是如何实现的?

Golang中的shadowing是指在一个更深层的作用域里声明一个与外层作用域有相同名称的符号。
导致外层符号被 shadow(遮蔽)。
它的实现包括:
一、 定义
在内层作用域重新声明一个与外层相同名称的变量:

func main() {
   x := 5   // 外层变量
   {
       x := 8 // 内层变量
       fmt.Println(x) // 8, 打印内层变量
   }

   fmt.Println(x) // 5, 继续使用外层变量 
}

这里内层作用域声明的x,遮蔽了外层的x。

二、 类型不同
即使类型不同,也会产生shadowing:

x := 5        // int 
{ 
    x := "hello" // string
    fmt.Println(x) // hello
}

只要名称相同,就会产生shadowing。

三、 原理
shadowing是 Go 编译器实现的。
内层变量会遮蔽外层同名变量。

四、 常量不能shadowing

const x = 5   
{
   const x = 8 // 错误!
   // 常量不允许被shadowing
}

只有变量能 shadowing。

总的来说, Go 中的 shadowing:

  1. 通过在内层声明同名变量实现
  2. 即使类型不同也可以实现
  3. 变量遮蔽外层同名变量
  4. 常量不可以被shadowing

它可以有效隔离作用域,降低变量污染。
并且内层变量使用结束后,变量名称重新可用。