如何在 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,其值为Booms。

    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 中使用接口与地图?的主要内容,如果未能解决你的问题,请参考以下文章

Golang YAML 使用地图读取

遍历 golang 地图

使用带有 golang 和数据库抽象的接口

为啥 Golang 需要接口?

在 golang 中使用私有地图、切片的最佳实践是啥?

关于地图在Golang编程语言