Назад к задачам
Junior — Senior
4

Преобразование одного интерфейса в другой

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

В примере есть тип Bar, у которого реализованы методы X(), Y() и Z(). На их основе объявлены два интерфейса: XY, требующий методов X() и Y(), и YZ, требующий методов Y() и Z(). Вопрос: можно ли выполнить приведение переменной типа XY к типу YZ?

type Bar struct{}

func (b *Bar) X() {}
func (b *Bar) Y() {}
func (b *Bar) Z() {}

type XY interface {
 X()
 Y()
}

type YZ interface {
 Y()
 Z()
}

func main() {
 var b XY = &Bar{}
 z := b.(YZ) // Сработает ли это приведение?
 z.X()       // А этот вызов?
 _ = z
}

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