> В чем разница наследования в Go и классического наследования (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

В Go нет классического наследования классов, как в Java или C++. Вместо этого используется композиция через встраивание (embedding). Основные различия:

  1. Отсутствие иерархии типов: В Go нет наследования с полиморфизмом подтипов. Встраивание позволяет включить поля и методы одного типа в другой, но это не создаёт отношение «является» (is-a). Вместо этого это отношение «содержит» (has-a).

  2. Переопределение методов: В классическом наследовании дочерний класс может переопределить метод родителя, и вызов через ссылку на родителя пойдёт в переопределённую версию (динамическая диспетчеризация). В Go при встраивании методы внешнего типа не переопределяют методы встроенного - они просто добавляются в набор методов внешнего типа. Если внешний тип определяет метод с тем же именем, он «затеняет» метод встроенного, но полиморфного вызова через интерфейс не происходит, если не используется интерфейс.

  3. Полиморфизм через интерфейсы: Вместо наследования Go использует интерфейсы для достижения полиморфизма. Любой тип, реализующий методы интерфейса, автоматически удовлетворяет ему (утиная типизация). Это более гибко, чем жёсткая иерархия.

    GO
    type Animal struct {
    Name string
    }
    func (a Animal) Speak() string {
    return "I'm an animal"
    }
    type Dog struct {
    Animal // встраивание
    }
    func (d Dog) Speak() string {
    return "Woof!"
    }
    // Dog имеет метод Speak(), который затеняет Animal.Speak()
    // Но если вызвать через интерфейс:
    var s Speaker = Dog{} // Speaker - интерфейс с методом Speak()
    fmt.Println(s.Speak()) // "Woof!"
  4. Отсутствие виртуальных функций: В Go нет ключевых слов virtual или override. Поведение определяется статически на этапе компиляции, за исключением вызовов через интерфейсы.

Итог: Go предлагает композицию и интерфейсы как альтернативу наследованию, что уменьшает связанность кода и упрощает тестирование, но требует иного подхода к проектированию.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью