Примечание: окклюзия не является заменой
Если в цикле 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