Форма краткой декларации :=
работает следующим образом:
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 комментарий:
Спасибо за статьи)
Отправить комментарий