Выбор ответа 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. Встраивание не даёт виртуальных методов.
Варианты ответа
baseправильный ответchild- Ошибка компиляции: неоднозначный вызов
base child
Разбор
Встраивание не даёт виртуальных методов. Hello поднимается из Base, а внутри него ресивер это Base, и b.Name() вызывает Base.Name, даже если у Child есть свой Name. Метод Child.Name затеняет Base.Name только при вызове на Child напрямую. Неоднозначности нет: Hello есть только у Base.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Структуры, методы и интерфейсы»
- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: интерфейс хранит копию значения
- Что выведет Go: method value и defer копируют ресивер
- Что выведет Go: nil-указатель в интерфейсе error