0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: go, golang, переназначение</p>
1
<p>Теги: go, golang, переназначение</p>
2
<p>В языке программирования<strong>Golang</strong>существуют такие понятия, как<strong>повторная декларация</strong>и<strong>переназначение</strong>. Рассмотрим их подробнее.</p>
2
<p>В языке программирования<strong>Golang</strong>существуют такие понятия, как<strong>повторная декларация</strong>и<strong>переназначение</strong>. Рассмотрим их подробнее.</p>
3
<p>Форма краткой декларации := работает так:</p>
3
<p>Форма краткой декларации := работает так:</p>
4
<p>Ниже -- объявление, вызываемое<strong>os.Open</strong>:</p>
4
<p>Ниже -- объявление, вызываемое<strong>os.Open</strong>:</p>
5
<p>Данный оператор объявляет 2 переменные: f и err. При этом несколько строк спустя происходит вызов<strong>f.Stat</strong>:</p>
5
<p>Данный оператор объявляет 2 переменные: f и err. При этом несколько строк спустя происходит вызов<strong>f.Stat</strong>:</p>
6
<p>Вызов<strong>f.Stat</strong>выглядит, как будто он объявляет d и err. Но ведь err появляется в обоих операторах. На самом деле, такое дублирование допускается, ведь err хоть и объявляется первым оператором, но переназначается вторым. Что это значит? Например, то, что вызов<strong>f.Stat</strong>задействует существующую переменную<strong>err</strong>, которая уже объявлена выше, следовательно, он всего лишь дает ей новое значение.</p>
6
<p>Вызов<strong>f.Stat</strong>выглядит, как будто он объявляет d и err. Но ведь err появляется в обоих операторах. На самом деле, такое дублирование допускается, ведь err хоть и объявляется первым оператором, но переназначается вторым. Что это значит? Например, то, что вызов<strong>f.Stat</strong>задействует существующую переменную<strong>err</strong>, которая уже объявлена выше, следовательно, он всего лишь дает ей новое значение.</p>
7
<p>При этом в объявлении := v-переменная может появляться даже в том случае, если она уже объявлялась, однако есть условия:</p>
7
<p>При этом в объявлении := v-переменная может появляться даже в том случае, если она уже объявлялась, однако есть условия:</p>
8
<ul><li>объявление находится в той же самой области, что и уже существующее объявление<strong>v</strong>(когда<strong>v</strong>уже является объявленной во внешней области видимости, объявление в итоге создаст новую переменную);</li>
8
<ul><li>объявление находится в той же самой области, что и уже существующее объявление<strong>v</strong>(когда<strong>v</strong>уже является объявленной во внешней области видимости, объявление в итоге создаст новую переменную);</li>
9
<li>можно присвоить<strong>v</strong>соответствующее значение в инициализации;</li>
9
<li>можно присвоить<strong>v</strong>соответствующее значение в инициализации;</li>
10
<li>в объявлении существует как минимум еще одна переменная, объявляемая заново.</li>
10
<li>в объявлении существует как минимум еще одна переменная, объявляемая заново.</li>
11
</ul><p>Такое необычное свойство является, по сути, чистым прагматизмом, облегчающим применение одного значения err, к примеру, в длинной цепочке<strong>if-else</strong>. На практике это используется довольно часто. Также важно отметить, что в языке Golang область действия как параметров функции, так и возвращаемых значений считается тем же самым, что и в случае с телом функции, причем даже тогда, когда они появляются лексически за пределами фигурных скобок, заключающих в себе тело.</p>
11
</ul><p>Такое необычное свойство является, по сути, чистым прагматизмом, облегчающим применение одного значения err, к примеру, в длинной цепочке<strong>if-else</strong>. На практике это используется довольно часто. Также важно отметить, что в языке Golang область действия как параметров функции, так и возвращаемых значений считается тем же самым, что и в случае с телом функции, причем даже тогда, когда они появляются лексически за пределами фигурных скобок, заключающих в себе тело.</p>
12
<p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
12
<p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
13
13