Затенение имени в Go
Затенение появляется, когда во вложенном блоке объявляют имя, которое уже есть снаружи. Внутреннее имя с тем же названием закрывает внешнее до конца блока. Внутри скобок команды читают внутреннюю переменную, после скобок снова видна внешняя.
Короткое объявление с одним уже известным
именем в той же области повторно не создает
переменную и не собирается. Если слева от
:= все имена уже объявлены в этой
области, нужен знак =:
n := 1
n := 2
Во вложенном блоке можно снова написать :=
с тем же именем. Это новая переменная для
внутренней области:
n := 1
{
n := 2
fmt.Println(n)
}
fmt.Println(n)
Сначала на экране 2, затем 1.
Снаружи блока остается старое значение
внешнего n.
Если слева от := есть хотя бы одно
новое имя, запись собирается. Старое имя
в списке не затеняют, а обновляют. После
такого блока внешнее n уже 2,
а extra снаружи скобок не видно:
n := 1
{
n, extra := 2, 3
fmt.Println(n)
fmt.Println(extra)
}
fmt.Println(n)
Дан следующий код:
x := 5
{
x := 9
fmt.Println(x)
}
fmt.Println(x)
Скажите, что выведется.
Дан следующий код:
a := 1
a := 4
Скажите, соберется ли программа.
Даны переменные:
m := 0
Во вложенном блоке объявите m заново
со значением 7, выведите его внутри
блока, затем выведите m снаружи.
Скажите оба числа на экране.