Форма краткой декларации := работает следующим образом:
f, err := os.Open(name)
if err != nil {
return err
}
d, err := f.Stat()
if err != nil {
f.Close()
return err
}
codeUsing(f, d)
Объявление, которое вызывает os.Open
f, err := os.Open(name)
Этот оператор объявляет две переменные, f и err. Несколько строк спустя, вызов f.Stat
d, err := f.Stat()
который выглядит так, как будто он объявляет d и err. Однако обратите внимание, что err появляется в обоих операторах. Это дублирование допустимо: err объявляется первым оператором, но только переназначен во втором. Это означает, что вызов f.Stat использует существующую переменную err, которая объявлена выше, и просто дает ей новое значение.
В объявлении := переменная v может появляться даже если она уже была объявлена, при условии:
- это объявление находится в той же области, что и существующее объявление
v(еслиvуже объявлена во внешней области видимости, объявление создаст новую переменную), - соответствующее значение в инициализации можно присвоить
v, и - в объявлении есть по крайней мере еще одна переменная, которая объявляется заново.
Это необычное свойство - чистый прагматизм, облегчающий использование одного значения err, например, в длинной цепочке if-else. Вы увидите, что это часто используется.
Здесь стоит отметить, что в Go область действия параметров функции и возвращаемых значений это то же самое, что и тело функции, даже если они появляются лексически вне фигурных скобок которые заключают в себе тело.
Читайте также:
- Эффективный Go: управляющие структуры, оператор if
- Эффективный Go: форматирование
- Эффективный Go: точки с запятой

1 комментарий:
Спасибо за статьи)
Отправить комментарий