Какую роль играют структуры в подходе Go к объектно-ориентированному программированию (ООП)?

Ответ

В 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 — это фундамент для создания сложных типов. В сочетании с методами, встраиванием и неявными интерфейсами они предоставляют гибкую и мощную альтернативу классической модели ООП.