Как в языке Go реализован механизм инкапсуляции?

Ответ

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

Правило простое: если идентификатор начинается с заглавной буквы, он является экспортируемым (публичным) и доступен из других пакетов. Если он начинается со строчной буквы, он неэкспортируемый (приватный) и доступен только внутри того же пакета.

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

Пример:

package user

// User - структура с экспортируемым и неэкспортируемым полем.
type User struct {
    Name string // Экспортируемое (публичное) поле, доступно из других пакетов.
    age  int    // Неэкспортируемое (приватное) поле, доступно только внутри пакета 'user'.
}

// NewUser - конструктор для создания нового пользователя.
func NewUser(name string, age int) *User {
    return &User{
        Name: name,
        age:  age, // Мы можем присваивать значение приватному полю внутри того же пакета.
    }
}

// GetAge - экспортируемый (публичный) метод для получения возраста.
func (u *User) GetAge() int {
    return u.age
}

// setAge - неэкспортируемый (приватный) метод.
// Может использоваться для внутренней логики внутри пакета.
func (u *User) setAge(age int) {
    // здесь может быть логика валидации
    u.age = age
}