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
那是为什么?可以在不使用类型断言的情况下将特定类型的映射传递/分配给泛型类型的映射吗?
答案 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