Как использовать интерфейс с картой в Голанге?

# #go #struct #interface

#Вперед #структура #интерфейс

Вопрос:

У меня есть структура, которая реализует интерфейс — следовательно, я могу назначить эту структуру переменной указанного интерфейса.

Но я хотел бы создать тип, который сопоставляется с интерфейсом string -gt; Wow, но чтобы иметь возможность использовать конкретную структуру при инициализации. Это не работает, я начинаю:

невозможно использовать (литерал map[string]Boom) (значение типа map[string]Boom) в качестве значения poppa в объявлении переменной

Любая помощь будет признательна!

 package main  type Whoa interface {  yes() }  type Boom struct {  hey string }  func (b Boom) yes() {  }  type poppa map[string]Whoa  func main() {  var thisWorks Whoa = Boom{}  var thisDoesnt poppa = map[string]Boom{} }  

Комментарии:

1. Вы не можете присвоить значение конкретного типа map[string]Boom{} переменной с конкретным типом poppa (a map[string]Whoa ). Значения карты имеют разные представления в памяти. Напишите код для копирования map[string]Boom{} в poppa .

Ответ №1:

 var thisWorks Whoa = Boom{}  

Это работает, потому Boom{} что реализует Whoa .

Вы можете подумать , что, поскольку Boom реализует Whoa , то map[string]Boom также может быть map[string]Whoa . Но это невозможно.

Что вы можете сделать, так это создать a map[string]Whoa , значения Boom{} которого равны s.

 var thisShould poppa = map[string]Whoa{"first": Boom{}}  

Мораль этой истории заключается в том, что фрагменты и карты типов интерфейса могут содержать любое значение, удовлетворяющее этому интерфейсу, но фрагменты и карты типов, удовлетворяющих интерфейсу, не эквивалентны фрагментам и картам этого интерфейса.

Напишите код для копирования карты[строка]Boom{} в папу

Если у вас было map[string]Boom что-то , в что вы хотели превратиться map[string]Whoa , правильный способ сделать это-что-то вроде:

 whoas := make(map[string]Whoa) for k, v := map[string]Boom{} {  whoas[k] = v }