代码块的作用域问题
程序员文章站
2022-03-18 10:02:12
package mainimport "fmt"func main() {{v := 1{v = 2fmt.Println(v) // 2}fmt.Println(v) // 2}//fmt.Println(v) // undefined: v//作用域与标识符的定义紧密相关(更准确的说是与标识符被声明的地方)a := 10{a := 3fmt.Println(a) // 3}fmt.Prin...
package main
import "fmt"
func main() {
{
v := 1
{
v = 2
fmt.Println(v) // 2
}
fmt.Println(v) // 2
}
//fmt.Println(v) // undefined: v
//作用域与标识符的定义紧密相关(更准确的说是与标识符被声明的地方)
a := 10
{
a := 3
fmt.Println(a) // 3
}
fmt.Println(a) // 10
// 变量标识符的作用域能到达最内层的代码块(不论是隐含的或者是显式用大括号包围起来的):
{
b := 4
{
fmt.Println(b)
{
//b = 5 // 输出为: 4 5 5
b := 5 // 输出为: 4 5 4
fmt.Println(b)
}
}
fmt.Println(b)
}
// 遮蔽(Shadowing)
// 在同一个代码块中,一个标识符不能被声明两次。
// 但是在内部的代码块中可以重新声明外部被声明了的标识符 (代码块可以像洋葱那样一层层嵌套的)。
// 如果在内层重新声明了标识符,那么在代码中起作用的声明是离代码最近的最里层的那个声明:
d := "outer"
fmt.Println(d)
{
d := "inner"
fmt.Println(d)
{
fmt.Println(d)
}
}
{
fmt.Println(d)
}
fmt.Println(d)
// 输出:
//outer
//inner
//inner
//outer
//outer
}
本文地址:https://blog.csdn.net/ayqy42602/article/details/108582481