Область видимости переменных в языке Go

Область видимости — это диапазон в исходном коде, в котором действует константа, тип, переменная, функция или пакет, представленные объявленным идентификатором.

В Go переменные можно объявлять в трёх местах:

  • Переменные, определённые внутри функции, называются локальными переменными
  • Переменные, определённые вне функции, называются глобальными переменными
  • Переменные в определении функции называются формальными параметрами

Далее давайте подробнее рассмотрим локальные переменные, глобальные переменные и формальные параметры.


Локальные переменные

Переменные, объявленные внутри тела функции, называются локальными переменными. Их область видимости ограничена телом функции. Параметры и переменные возвращаемых значений также являются локальными переменными.

В следующем примере функция main() использует локальные переменные a, b и c:

Пример

package main

import "fmt"

func main() {
   /* объявление локальных переменных */
   var a, b, c int

   /* инициализация параметров */
   a = 10
   b = 20
   c = a + b

   fmt.Printf ("Результат: a = %d, b = %d и c = %d\n", a, b, c)
}

Результат вывода приведённого выше примера:

结果: a = 10, b = 20 and c = 30

Глобальные переменные

Переменные, объявленные вне тела функции, называются глобальными переменными. Глобальные переменные можно использовать во всём пакете или даже во внешних пакетах (после экспорта).

Глобальные переменные можно использовать в любой функции. Следующий пример демонстрирует, как использовать глобальные переменные:

Пример

package main

import "fmt"

/* объявить глобальные переменные */
var g int

func main() {

   /* объявление локальных переменных */
   var a, b int

   /* инициализация параметров */
   a = 10
   b = 20
   g = a + b

   fmt.Printf("Результат: a = %d, b = %d и g = %d\n", a, b, g)
}

Результат вывода приведённого выше примера:

结果: a = 10, b = 20 and g = 30

В программах на языке Go глобальные и локальные переменные могут иметь одинаковые имена, но локальные переменные внутри функции имеют приоритет. Вот пример:

Пример

package main

import "fmt"

/* объявить глобальные переменные */
var g int = 20

func main() {
   /* объявление локальных переменных */
   var g int = 10

   fmt.Printf ("Результат: g = %d\n",  g)
}

Результат вывода приведённого выше примера:

结果: g = 10

Формальные параметры

Формальные параметры используются как локальные переменные функции. Вот пример:

Пример

package main

import "fmt"

/* объявить глобальные переменные */
var a int = 20;

func main() {
   /* объявить локальные переменные в функции main */
   var a int = 10
   var b int = 20
   var c int = 0

   fmt.Printf("a = %d в функции main()\n",  a);
   c = sum( a, b);
   fmt.Printf("c = %d в функции main()\n",  c);
}

/* определение функции - сложение двух чисел */
func sum(a, b int) int {
   fmt.Printf("a = %d в функции sum()\n",  a);
   fmt.Printf("b = %d в функции sum()"\n",  b);

   return a + b;
}

Результат вывода приведённого выше примера:

main()函数中 a = 10
sum() 函数中 a = 10
sum() 函数中 b = 20
main()函数中 c = 30

Инициализация локальных и глобальных переменных

Значения по умолчанию для различных типов локальных и глобальных переменных:

Типы данных Инициализация значений по умолчанию
int 0
float32 0
указатель nil
Другие расширения