воскресенье, 17 мая 2020 г.

Затененные (shadowed) переменные в Golang

Почему переменная 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


Читайте также:


Комментариев нет:

Отправить комментарий