Что произойдёт при выполнении следующего кода?
var s Stringer = Dog{Name: "Rex"} cat, ok := s.(Cat)
Где Stringer — интерфейс с методом String() string, Dog и Cat — разные типы, оба реализуют Stringer.
Stringer
String() string
Dog
Cat
Паника в рантайме: динамический тип Dog не совпадает с запрошенным Cat
Ошибка компиляции: assertion к типу, не связанному с текущим значением интерфейса
ok == false, cat хранит значение Dog, приведённое к типу Cat без потери данных
ok == false
cat
ok == false, cat — нулевое значение типа Cat, паники не возникает