Фиксированная версия, на Play
Как уже упоминалось, в Go нет автоматического приведения типов.
И [] Кошка совершенно отличается от [] Животного.
Все, что вам действительно нужно было сделать, это создать фрагмент типа, который вы передадите методу speaks
.
Итак, измените:
arrayCats := []Cat{cat1, cat2, cat3}
до
arrayCats := []Animal{cat1, cat2, cat3}
И это прекрасно работает.
Если вы привыкли к таким языкам, как Java, они поступают совершенно иначе, поскольку java рассматривает все как Object
. Поэтому, когда они добавили дженерики, это был простой трюк во время компиляции, когда коллекция была просто списком Object
, а компилятор вставлял приведение в точку извлечения.
Такие вещи, как int
, не являются объектами в Java, поэтому вы не можете создать List<int>
, потому что тогда трюк List<Object>
не сработает. Потому что int
не является подклассом Object
.
В go нет общего базового типа для таких вещей, как struct, поэтому нет реального способа выполнить трюк приведения, который делает java.
Как уже упоминали другие, есть также некоторые специфические особенности того, как go управляет памятью, благодаря чему такие вещи, как автоконвертация, не работают в общем виде (то есть: фрагмент int64 - это другой объем памяти, чем фрагмент int32, поэтому не может быть вычтен без выделения).
команда go заявила, что планирует добавить дженерики в той или иной форме, что потенциально облегчит написание таких вещей. Но это будет связано с невидимой сложностью времени выполнения или компиляции (или обоих).
Сегодня, поскольку он не является автоматическим, вы должны написать код, чтобы выполнить преобразование.
Который имеет обратную сторону вы пишете больше кода. И положительным моментом является то, что происходит в системе.