Что такое глобальная переменная в Go и каковы особенности её использования?

Ответ

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

Ключевые особенности:

  • Область видимости: Доступна во всем пакете, в котором объявлена.
  • Экспорт: Видимость за пределами пакета (экспорт) определяется регистром первой буквы имени переменной. Если имя начинается с заглавной буквы (например, GlobalVar), она экспортируется и доступна из других пакетов. Если с маленькой (globalVar) — она приватна для текущего пакета.
  • Инициализация: Глобальные переменные инициализируются до вызова функции main(). Если начальное значение не указано, они инициализируются нулевым значением для своего типа (0 для чисел, false для bool, "" для строк, nil для указателей и т.д.).
  • Жизненный цикл: Существует в течение всего времени выполнения программы.

Пример:

package main

import "fmt"

var globalCounter int = 42 // Глобальная переменная, приватная для пакета main
var ExportedVar string = "Hello from another package!" // Экспортируемая глобальная переменная

func main() {
    fmt.Println("Начальное значение:", globalCounter)
    increment()
    fmt.Println("После инкремента:", globalCounter)
}

func increment() {
    globalCounter++ // Изменение глобальной переменной
}

Проблемы и риски использования:

  • Неявные зависимости и состояние: Усложняет понимание и отслеживание потока данных в приложении. Функция, использующая глобальную переменную, имеет скрытую зависимость, что делает код менее предсказуемым.
  • Гонки данных (Race Conditions): При одновременном доступе на чтение и запись из нескольких горутин без надлежащей синхронизации (например, с помощью мьютексов) возникают гонки данных.
  • Тестирование: Затрудняет написание изолированных модульных тестов, так как тесты могут влиять друг на друга через общее состояние глобальной переменной.