在一个for循环中,如果我们在循环体内部声明了一个与初始化语句中的变量同名的变量,那么这个新变量会“遮挡”外部的同名变量。但这种遮挡只在声明它的那一行代码开始,直到循环体结束的范围内有效。当下一次循环开始时,外部的同名变量会重新显现,并继续使用for声明语句中的值。

可以把for循环中的变量i想象成一个房间里的灯泡,而i := i这一行代码就像是在房间的一角放了一个遮挡灯光的屏风。

for i := 0; i < 3; i++ {
	fmt.Println("before:", i)
	i := i
	i = 100
	fmt.Println("after:", i)
}

输出:

before: 0
after: 100
before: 1
after: 100
before: 2
after: 100
08-10 14:12