Что выведет: type T struct{}; func (T) M() { fmt.Println("T") }; type S struct { T }; func (S) M() { fmt.Println("S") }; var i interface{ M() } = S{}; i.M()?

Middle
97 просмотров
AFK Offer AI

Выведет "S". Method set S.M() перекрывает embedded T.M(). Это embedding, не наследование — promoted методы перекрываются одноимёнными. Если бы S не имел M(), вызвался бы T.M() через promotion. Но нет виртуальных вызовов: T.M() внутри не может вызвать S.M() — нет полиморфизма через embedding.

Следующий вопрос

Как определить table bloat?