Тип Pet
, объявленный как []string
, не может быть инициализирован значением типа Cat
, поскольку Cat
и string
- это разные типы. Вот как работает система типа Go. Когда вы определяете новый тип как type name otherType
, name
становится совершенно новым типом с той же структурой памяти, что и базовый тип. Например, новый тип не будет иметь методов, определенных для otherType
. Однако вы можете преобразовать Cat
в строку:
p := Pet{string(Cat("Whiskers")), string(Cat("Fluffy"))}
Тогда Pet
все еще будет массивом строк.
Когда вы определите Pet
как массив интерфейсов с помощью метода Name
, тогда Cat
теперь можно использовать для инициализации элементов Pet
, поскольку Cat
реализует метод Name
.
Короче говоря: Pet
как []string
содержит только строковые значения. Pet
как []interface{Name{}}
содержит любое значение, которое реализует метод Name
. Если вам нужно вызвать метод Name
для Pet
элементов, то вы должны сделать это с помощью интерфейса.