Ответ
Глобальная переменная в 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): При одновременном доступе на чтение и запись из нескольких горутин без надлежащей синхронизации (например, с помощью мьютексов) возникают гонки данных.
- Тестирование: Затрудняет написание изолированных модульных тестов, так как тесты могут влиять друг на друга через общее состояние глобальной переменной.