Sobes.tech
Back to questions
Senior
6

В Go нет наследования как в Java. Как объяснить джуну с Java-бэкграундом переиспользование кода в Go и почему это может быть лучше?

Companies where asked
Spectr

Answer from AI

sobes.tech AI

В Go нет классического наследования, как в Java, где один класс расширяет другой. Вместо этого Go использует композицию и интерфейсы для переиспользования кода.

Композиция — это когда одна структура содержит другую как поле, тем самым "встраивая" её функциональность. Это позволяет строить сложные типы из простых, избегая жесткой иерархии.

Интерфейсы в Go описывают поведение (набор методов), а не структуру. Любой тип, реализующий методы интерфейса, автоматически удовлетворяет этому интерфейсу, без явного объявления.

Почему это лучше:

  • Гибкость: можно комбинировать разные поведения без сложных иерархий.
  • Простота: меньше связей между типами, легче понимать и тестировать.
  • Отсутствие проблем с множественным наследованием: в Java оно запрещено, а в Go композиция решает эту задачу естественно.

Пример композиции:

package main
import "fmt"

type Logger struct {}

func (l Logger) Log(msg string) {
    fmt.Println("Log:", msg)
}

type Service struct {
    Logger // встраиваем Logger
}

func (s Service) DoWork() {
    s.Log("Начинаем работу")
    // ...
    s.Log("Работа завершена")
}

func main() {
    svc := Service{}
    svc.DoWork()
}

Здесь Service не наследует Logger, а просто включает его, получая доступ к методу Log. Такой подход проще и более явный, чем наследование.