如何在 Golang 中使用接口与地图?
Posted
技术标签:
【中文标题】如何在 Golang 中使用接口与地图?【英文标题】:How to use interface with map in Golang? 【发布时间】:2022-01-13 17:38:24 【问题描述】:我有一个实现接口的结构 - 因此我可以将该结构分配给所述接口的变量。
但我想创建一个从 string -> Whoa 接口映射的类型,但在初始化时能够使用具体的结构。这不起作用,我得到:
不能在变量声明中使用 (map[string]Boom literal) (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
【问题讨论】:
您不能将具体类型为map[string]Boom
的值赋给具体类型为poppa
的变量(map[string]Whoa
)。映射值在内存中具有不同的表示形式。编写代码将map[string]Boom
复制到poppa
。
【参考方案1】:
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
故事的寓意是,接口类型的切片和映射可以保存满足该接口的任何值,但满足接口的类型的切片和映射不等同于该接口的切片和映射 em>。
编写代码将地图[string]Boom复制到poppa
如果您想将 map[string]Boom
转换为 map[string]Whoa
,正确的做法是:
whoas := make(map[string]Whoa)
for k, v := map[string]Boom
whoas[k] = v
【讨论】:
以上是关于如何在 Golang 中使用接口与地图?的主要内容,如果未能解决你的问题,请参考以下文章