Назад к вопросам
Senior
7
В Go нет наследования как в Java. Как объяснить джуну с Java-бэкграундом переиспользование кода в Go и почему это может быть лучше?
Компании, где спрашивали
Spectr
Ответ от нейросети
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. Такой подход проще и более явный, чем наследование.