Ответ
В Go нет классов в классическом понимании, как в Java или C++. Вместо них структуры (struct
) являются центральным элементом для построения типов данных со своим состоянием и поведением. Они лежат в основе идиоматического подхода Go к ООП, который реализуется через следующие концепции:
1. Энкапсуляция
Структуры объединяют данные (поля) и поведение (методы). Метод — это функция с "получателем" (receiver), которая привязывает её к конкретному типу структуры.
- Видимость полей и методов контролируется регистром первой буквы имени:
UpperCase
— публичный (экспортируемый),lowerCase
— приватный (доступен только внутри пакета).
type Circle struct {
radius float64 // приватное поле
}
// Публичный метод, привязанный к Circle
func (c *Circle) Area() float64 {
return 3.14 * c.radius * c.radius
}
2. Композиция вместо наследования
Go сознательно избегает классического наследования. Вместо этого он поощряет композицию через встраивание (embedding). Одна структура встраивается в другую, и её поля и методы "поднимаются" на верхний уровень.
type Person struct {
Name string
}
func (p Person) Greet() {
fmt.Printf("Hello, my name is %sn", p.Name)
}
// Employee "наследует" поведение Person через встраивание
type Employee struct {
Person // Встроенный тип
Salary float64
}
// e := Employee{Person: Person{Name: "Alice"}}
// e.Greet() // Метод Greet() доступен напрямую
3. Полиморфизм
Полиморфизм в Go достигается с помощью интерфейсов. Интерфейс — это набор сигнатур методов. Любая структура, которая реализует все методы интерфейса, автоматически (неявно) удовлетворяет этому интерфейсу.
type Shape interface {
Area() float64
}
// Структура Circle неявно реализует интерфейс Shape,
// так как у нее есть метод Area() float64.
func PrintArea(s Shape) {
fmt.Printf("Area is: %fn", s.Area())
}
Итог: Структуры в Go — это фундамент для создания сложных типов. В сочетании с методами, встраиванием и неявными интерфейсами они предоставляют гибкую и мощную альтернативу классической модели ООП.