Область видимости (scope) определяет набор правил, по которым осуществляется доступ к объявленным переменным, константам и функциям из различных блоков кода.
В Go область видимости можно охарактеризовать двумя параметрами:
- глобальность/локальность;
- экспортируемость/неэкспортируемость.
Глобальность/локальность
Объявленные в теле функций переменные, константы и функции характеризуются как локальные, то есть их область видимости ограничена тем блоком кода, в котором они объявлены.
В Go локальные переменные можно объявлять ключевым словом var
или короткой нотацией :=
.
Рассмотрим пример, который иллюстрирует область видимости локальной переменной:
Объявленные вне тела функции сущности характеризуются как глобальные и находятся в области видимости всех блоков кода в пакете. То есть глобальные объекты доступны во всех файлах, находящихся в одной директории.
Глобальные переменные нельзя объявлять короткой нотацией :=
, необходимо ключевое слово var
. Если глобальная переменная не инициализирована, она принимает нулевое значение указанного типа.
Экспортируемость/неэкспортируемость
Если предыдущее свойство характеризует доступность объекта внутри пакета, то экспортируемость регламентирует доступность из других пакетов. Пакет в Go — это все файлы c расширением .go
в одной директории, кроме оканчивающихся на _test.go
.
Note
Экспортируемыми могут быть только глобальные сущности.
Экспортируемые переменные, константы и функции определённого пакета доступны из тех пакетов, которые импортируют этот пакет ключевым словом import
.
Доступ к экспортируемым объектам осуществляется конструкцией <имя пакета>.<Имя сущности>
. Проиллюстрируем на примере Hello, world!
:
Здесь в функции main
программа обращается к пакету стандартной библиотеки fmt
, вызывая её экспортируемую функцию Println
.
💡💡💡
Как Go определяет, что сущность экспортируемая? Если имя переменной, константы или функции начинается с прописной буквы, то она экспортируемая. Если со строчной, то неэкспортируемая.
К неэкспортируемым сущностям нельзя обратиться за пределами пакета. Этот подход — часть того особенного ООП, который реализует в Go сокрытие данных или инкапсуляцию.
Проиллюстрируем на примере определение экспортируемых и неэкспортируемых объектов.
Если импортировать этот пакет, то будут доступны константа Email
, функции SetSupport
и GetContact
.
📂 Go | Последнее изменение: 15.08.2024 15:08