вторник, 22 января 2019 г.

Эффективный Go: повторная декларация и переназначение

Форма краткой декларации := работает следующим образом:

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 область действия параметров функции и возвращаемых значений это то же самое, что и тело функции, даже если они появляются лексически вне фигурных скобок которые заключают в себе тело.


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


1 комментарий:

Unknown комментирует...

Спасибо за статьи)

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