Ответ
В Go инкапсуляция и управление видимостью реализованы на уровне пакетов и контролируются регистром первой буквы идентификатора (имени переменной, функции, типа или константы).
Экспортируемый (публичный) идентификатор
Начинается с заглавной буквы (например,PublicVar
,DoSomething
). Он доступен из любого другого пакета, который импортирует данный пакет.Неэкспортируемый (приватный) идентификатор
Начинается со строчной буквы (например,privateVar
,doSomething
). Он доступен только внутри того пакета, в котором был объявлен. Попытка обратиться к нему из другого пакета приведёт к ошибке компиляции.
Это основной механизм Go для сокрытия деталей реализации и предоставления чистого API пакета.
Пример:
// Файл: mypackage/vars.go
package mypackage
// PublicVar доступна из других пакетов
var PublicVar string = "Это публичная переменная"
// privateVar доступна только внутри пакета mypackage
var privateVar int = 42
// Файл: main.go
package main
import (
"fmt"
"example.com/mypackage" // Импортируем наш пакет
)
func main() {
// Корректно: обращаемся к экспортируемой переменной
fmt.Println(mypackage.PublicVar)
// Ошибка компиляции: mypackage.privateVar is not exported
// fmt.Println(mypackage.privateVar)
}