Ответ
Go не является классическим объектно-ориентированным языком (как Java или C++), но он идиоматично реализует ключевые принципы ООП через свои уникальные механизмы.
-
Инкапсуляция — сокрытие внутреннего состояния объекта от внешнего мира.
- Реализация в Go: Управляется на уровне пакетов через экспорт имён. Идентификаторы (переменные, функции, типы, поля структур), начинающиеся с большой буквы, экспортируются и доступны из других пакетов. Идентификаторы с маленькой буквы являются приватными для пакета.
// в пакете 'wallet' type Wallet struct { balance int // неэкспортируемое (приватное) поле } // Экспортируемый конструктор func New() *Wallet { return &Wallet{balance: 0} } // Экспортируемый метод для изменения состояния func (w *Wallet) Deposit(amount int) { w.balance += amount }
-
Композиция вместо наследования — Go сознательно отказывается от классического наследования классов в пользу композиции.
- Реализация в Go: Через встраивание (embedding) структур. Когда одна структура встраивается в другую, её поля и методы "поднимаются" на уровень внешней структуры. Это обеспечивает переиспользование кода, но является отношением "has-a" (имеет), а не "is-a" (является).
type Engine struct { /* ... */ } func (e *Engine) Start() { /* ... */ } type Car struct { Engine // Встраивание Engine в Car Wheels int } // car.Start() будет работать напрямую car := Car{Wheels: 4} car.Start() // Метод Start() "унаследован" от Engine
-
Полиморфизм — способность объектов с разной внутренней реализацией отвечать на один и тот же вызов метода.
- Реализация в Go: Через интерфейсы. В Go полиморфизм неявный (или "утиная типизация"): тип удовлетворяет интерфейсу автоматически, если он реализует все его методы. Нет необходимости в ключевом слове
implements
.
type Speaker interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "Woof!" } type Cat struct{} func (c Cat) Speak() string { return "Meow!" } // Функция принимает любой тип, удовлетворяющий интерфейсу Speaker func MakeSound(s Speaker) { fmt.Println(s.Speak()) } MakeSound(Dog{}) MakeSound(Cat{})
- Реализация в Go: Через интерфейсы. В Go полиморфизм неявный (или "утиная типизация"): тип удовлетворяет интерфейсу автоматически, если он реализует все его методы. Нет необходимости в ключевом слове
-
Абстракция — выделение главных, наиболее значимых характеристик объекта и отвлечение от несущественных.
- Реализация в Go: Интерфейсы являются главным инструментом абстракции. Они определяют контракт (поведение), не раскрывая детали реализации. Это позволяет писать гибкий, слабосвязанный код, который зависит от абстракций, а не от конкретных типов.