Почему переменная n не меняется?
func main() {
n := 0
if true {
n := 1
n++
}
fmt.Println(n) // 0
}
Ответ
Оператор
n := 1объявляет новую переменную, которая затеняет оригинал n во всей области действия оператора if.
Чтобы повторно использовать n из внешнего блока, вместо этого напишите
n = 1
func main() {
n := 0
if true {
n = 1
n++
}
fmt.Println(n) // 2
}
Обнаружение затененных переменных
Чтобы помочь обнаружить затененные переменные, вы можете использовать экспериментальную функцию -shadow, предоставляемую инструментом vet. Он помечает переменные, которые могли быть непреднамеренно скрыты. Передача оригинальной версии кода vet выдает предупреждение.
$ go vet -shadow main.go
main.go:4: declaration of "n" shadows declaration at main.go:2
С версии Go 1.12 это больше не поддерживается. Вместо этого вы можете сделать
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)
Кроме того, компилятор Go обнаруживает и запрещает некоторые случаи затенения.
func Foo() (n int, err error) {
if true {
err := fmt.Errorf("Invalid")
return
}
return
}
../main.go:4:3: err is shadowed during return
Читайте также:
- Спецификация Go: переменные (variables)
- Спецификация Go: блоки
- Спецификация Go: объявления и области видимости
Комментариев нет:
Отправить комментарий