KorroLion
@KorroLion

Почему type []User нельзя использовать как type []UserInterface?

play.golang.org/p/RKgQXPVGnb


type User struct {
Name string
}

func (u User) Say() {
fmt.Println(u.Name)
}

type UserInterface interface {
Say()
}

type Collection struct {
Admin UserInterface
People []UserInterface
}


Это верно:

collection := new(Collection)
collection.Admin = User{"Alex"}


Тогда почему это неверно:

alex := User{"Alex"}
max := User{"Max"}

collection.People = []User{alex, max}

cannot use []User literal (type []User) as type []UserInterface in assignment
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
fastpars
@fastpars
к.о. потому что это разные типы )
play.golang.org/p/Wtat6zWKRC
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Tyranron
@Tyranron
Это сделано намеренно, дабы избежать неявных дорогих преобразований.

Первое, что нужно знать — это отличия «структуры» от «интерфейса» в Go. Это просто, и этого достаточно, чтобы понять, почему вы просто так не можете «скастить» слайс структур в слайс интерфейсов.
...
Второе — и созвучное с выше обсужденными слайсами — это то, операция конвертирования слайсов — дорогая операция. По времени это O(n) и компилятор Go подобные дорогие вещи не будет делать, чтобы не давать нерадивым программистам писать медленный код. Хотите делать потенциально дорогую операцию — будьте добры, сделайте это явно, вся ответственность на вас, а не на компиляторе.

Детальнее:
Холиворная статья: причина №4
Объяснение на SO
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы