Как в Go реализуется инкапсуляция? Что такое экспортируемые и неэкспортируемые идентификаторы?

Ответ

В Go нет ключевых слов public или private, как в других языках. Видимость (инкапсуляция) определяется на уровне пакета и управляется регистром первой буквы идентификатора (имени переменной, функции, типа или поля структуры).

Правило очень простое:

  • Экспортируемый (публичный) идентификатор: Имя начинается с заглавной буквы (например, PublicVar, MyFunction). Он доступен из любого другого пакета, который импортирует данный пакет.
  • Неэкспортируемый (приватный) идентификатор: Имя начинается со строчной буквы (например, privateVar, myFunction). Он доступен только в пределах того же пакета, в котором определен.

Пример

package mypackage

// PublicVar - экспортируемая переменная, доступна из других пакетов.
var PublicVar string = "I'm public!"

// privateVar - неэкспортируемая переменная, доступна только внутри mypackage.
var privateVar string = "I'm private to mypackage."

// MyStruct - экспортируемый тип структуры.
type MyStruct struct {
    // PublicField - экспортируемое поле.
    PublicField int
    // privateField - неэкспортируемое поле.
    privateField string
}

// PublicFunc - экспортируемая функция.
func PublicFunc() string {
    return "You can call me from anywhere."
}

// privateFunc - неэкспортируемая функция.
func privateFunc() string {
    return "You can only call me from within mypackage."
}

Ключевая идея заключается в том, что инкапсуляция в Go работает на уровне пакетов, а не классов или файлов. Это простой, но мощный механизм для сокрытия внутренней реализации и предоставления чистого публичного API.