我有一个函数:
func ReturnTuples(map_ map[interface{}]interface{}) [][]interface{} {
我试图这样调用:
m := make(map[string]int)
m["k1"] = 7
m["k2"] = 13
fmt.Println(ReturnTuples(m))
但我正在获得
cannot use m (type map[string]int) as type map[interface {}]interface {} in argument to ReturnTuples
string
和int
都实现了interface{}
,那么为什么它不能工作呢?
我已经搜索过了,最好的结果是将map[interface{}]interface{}转换为map[string]string,但它并不能回答为什么我不能使用m
作为参数。
我还相信,如果函数的参数只有interface{}
,也可以工作,因为map[something][something]
实现了interface
,对吗?哪种方法是最好的,为什么在我的情况下它不起作用呢?
map[string]int
传递给map[interface{}]interface{}
的原因是string
,int
和interface{}
具有不同的数据结构。string
是一个单指针,可能是64位的,int
可能是有符号的64位值,而interface{}
则是由两个名为 emptyInterface 的指针组成的结构。 - ymonadstring
和int
传递给interface{}
的原因是,Golang的运行时会在需要时使用 runtime.convT2E() 进行隐式转换。 - ymonadmap[string]int
转换为map[interface{}]interface{}
,你需要对所有的键和值调用runtime.convT2E
函数进行转换。当然,你可以编写代码来实现这个操作,但是Golang的运行时库不会自动执行这个操作。 - ymonad