Выбор ответа Middle Структуры, методы и интерфейсы спрашивают часто обновлено

Встраивание: чей метод вызовется

Вопрос

Что выведет fmt.Println(Child{}.Hello())?

type Base struct{}

func (Base) Name() string  { return "base" }
func (b Base) Hello() string { return b.Name() }

type Child struct{ Base }

func (Child) Name() string { return "child" }

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: base. Встраивание не даёт виртуальных методов.

Варианты ответа

  1. baseправильный ответ
  2. child
  3. Ошибка компиляции: неоднозначный вызов
  4. base child

Разбор

Встраивание не даёт виртуальных методов. Hello поднимается из Base, а внутри него ресивер это Base, и b.Name() вызывает Base.Name, даже если у Child есть свой Name. Метод Child.Name затеняет Base.Name только при вызове на Child напрямую. Неоднозначности нет: Hello есть только у Base.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.