Ответ
В 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
}