为什么不使用map [] interface {}获取map [] SpecificInterface

时间:2018-12-18 10:24:56

标签: go interface casting

go规范指出:

  

接口类型的变量可以使用方法集合存储任何类型的值,该方法集是接口的任何超集。

我可以这样

type Source interface{}
type SourceImpl struct{}

var s Source
g := new(interface{})
s = new(SourceImpl)

*g = s

但是,我对地图却无法做到这一点:

generic := make(map[string]*interface{})
specific := make(map[string]*Source)

generic = specific

给予:

cannot use specific (type map[string]*Source) as type map[string]*interface {} in assignment

那是为什么?可以在不使用类型断言的情况下将特定类型的映射传递/分配给泛型类型的映射吗?

3 个答案:

答案 0 :(得分:0)

因为map[]interface{}map[]SpecificInterface是2种不同的类型。 如果将通用类型设为空接口,则可以正常工作。

var generic interface{}
specific := make(map[string]*Source)

generic = specific

但是,如果要这样做,则要使用地图时就需要进行一些类型切换或类型断言。

答案 1 :(得分:0)

由于Go是一种静态类型语言,尽管interface {}和Source具有相同的基础类型,但是如果不进行转换就无法将它们彼此分配。
因此,您必须在循环中进行转换:

generic := make(map[string]interface{})
specific := make(map[string]*Source)

for k, v := range specific {
    generic[k] = v
}

您是否注意到我将* interface {}更改为interface {}? 那是您的代码的另一个问题,在Go指向interface {}的指针中没有意义。

答案 2 :(得分:0)

虽然没有直接回答问题,但看起来go社区正在慢慢开始改变主意,并开始考虑为Go2支持泛型:https://go.googlesource.com/proposal/+/master/design/go2draft-generics-overview.md