Go语言里简短声明语句词法域问题
简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。
第一个程序
在第一个程序中,for循环内部的a := 1是一个新的变量声明,它只在for循环的块作用域内有效。这个新的局部变量a遮蔽(shadows)了外层的全局变量a。因此,最后打印a的值仍是5.
go
package main
import "fmt"
func main() {
a := 5
fmt.Println(a)
for i := 1; i < 3; i++ {
a := 1
fmt.Println(a)
}
fmt.Println(a)
}
开始 声明并初始化a为5 打印a的值 进入for循环 声明新的局部变量a为1 打印局部变量a的值 循环结束 打印全局变量a的值 结束
第二个程序
在这个程序中,for循环内部没有使用:=,这意味着a = 1是在修改外层作用域中的全局变量a。因此,在循环内部打印的是全局变量a的值,即1。由于全局变量a被修改了,所以循环结束后最后打印的也是1。
go
package main
import "fmt"
func main() {
a := 5
fmt.Println(a)
for i := 1; i < 3; i++ {
a = 1
fmt.Println(a)
}
fmt.Println(a)
}
开始 声明并初始化a为5 打印a的值 进入for循环 修改全局变量a为1 打印全局变量a的值 循环结束 打印全局变量a的值 结束