Ответ
Инкапсуляция — это один из ключевых принципов ООП, который объединяет данные (состояние) и методы для работы с этими данными в единый объект, при этом скрывая детали реализации от внешнего мира.
В Go, где нет классов в их классическом понимании, инкапсуляция реализуется на уровне пакетов через механизм экспорта.
Способы достижения:
- Неэкспортируемые идентификаторы: Любой идентификатор (переменная, тип, функция, поле структуры), начинающийся со строчной буквы, является неэкспортируемым. Он доступен только внутри того пакета, в котором определен.
- Экспортируемые идентификаторы: Идентификаторы, начинающиеся с заглавной буквы, экспортируются и доступны из других пакетов.
- Геттеры и сеттеры: Для контролируемого доступа к неэкспортируемым полям структуры создаются экспортируемые методы.
Пример (пакет wallet
):
package wallet
// Wallet инкапсулирует баланс.
type Wallet struct {
balance int // неэкспортируемое поле, доступно только внутри пакета wallet
}
// NewWallet - конструктор для создания кошелька.
func NewWallet(initialBalance int) *Wallet {
return &Wallet{balance: initialBalance}
}
// Deposit - экспортируемый метод для пополнения (сеттер).
func (w *Wallet) Deposit(amount int) {
if amount > 0 {
w.balance += amount
}
}
// Balance - экспортируемый метод для получения баланса (геттер).
func (w *Wallet) Balance() int {
return w.balance
}
Преимущества:
- Защита данных: Нельзя напрямую изменить внутреннее состояние объекта, минуя его логику (например, нельзя установить отрицательный баланс).
- Контроль доступа: API пакета становится чище и понятнее.
- Гибкость рефакторинга: Можно изменить внутреннюю реализацию (например, поле
balance
), не затрагивая код, который использует пакет.