如何在 Golang 中使用 map 接口?

How to use interface with map in Golang?

我有一个实现接口的结构 - 因此我可以将该结构分配给所述接口的变量。

但我想创建一个从字符串映射到 Whoa 接口的类型,但要能够在初始化时使用具体结构。这不起作用,我得到:

不能使用(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{}
}
    var thisWorks Whoa = Boom{}

之所以有效,是因为 Boom{} 实现了 Whoa

您可能会想,既然 Boom 实现了 Whoa,那么 map[string]Boom 也可以是 map[string]Whoa。但是不能。

可以做的是创建一个map[string]Whoa,其值为Boom{}s。

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

故事的寓意是,接口类型的切片和映射可以包含满足该接口的任何值,但满足接口的类型的切片和映射不等同于那个接口.

Write code to copy the map[string]Boom{} to a poppa

如果您有一个 map[string]Boom 想要变成 map[string]Whoa,正确的方法是:

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