Переназначение в Go
В языке программирования Golang существуют такие понятия, как повторная декларация и переназначение. Рассмотрим их подробнее.
Форма краткой декларации
Ниже -- объявление, вызываемое os.Open:
Данный оператор объявляет 2 переменные: f и err. При этом несколько строк спустя происходит вызов f.Stat:
Вызов f.Stat выглядит, как будто он объявляет d и err. Но ведь err появляется в обоих операторах. На самом деле, такое дублирование допускается, ведь err хоть и объявляется первым оператором, но переназначается вторым. Что это значит? Например, то, что вызов f.Stat задействует существующую переменную err, которая уже объявлена выше, следовательно, он всего лишь дает ей новое значение.
При этом в объявлении
- объявление находится в той же самой области, что и уже существующее объявление v (когда v уже является объявленной во внешней области видимости, объявление в итоге создаст новую переменную);
- можно присвоить v соответствующее значение в инициализации;
- в объявлении существует как минимум еще одна переменная, объявляемая заново.
Такое необычное свойство является, по сути, чистым прагматизмом, облегчающим применение одного значения err, к примеру, в длинной цепочке if-else. На практике это используется довольно часто. Также важно отметить, что в языке Golang область действия как параметров функции, так и возвращаемых значений считается тем же самым, что и в случае с телом функции, причем даже тогда, когда они появляются лексически за пределами фигурных скобок, заключающих в себе тело.
По материалам https://golang-blog.blogspot.com/.