# #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
(amap[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 }