Go 使用map[string]int作为map[interface{}]interface{}类型的参数
我有一个功能:Go 使用map[string]int作为map[interface{}]interface{}类型的参数,go,Go,我有一个功能: 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 {}
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
都实现了接口{}
,那么它不应该工作吗
我已经搜索过了,我能找到的最好的答案是,但它无法回答为什么我不能使用m
作为参数
我还相信,如果函数的参数只是
interface{}
,它也会工作,因为map[something][something]
实现了interface
,对吗?最好的方法是什么,以及为什么在我的情况下不起作用?要解决您的问题,只需将映射初始化为空接口中的空接口:
m:=map[interface{}]interface{}
然后,您可以在“ReturnTuples”函数中指定所需的任何类型键或值
注意:请记住,如果以后要将值用作原始类型,则需要使用类型断言,因为现在它们的类型为interface{}
您可以这样做,WAREanything
是使用for循环可以获得的一个映射值:
switch v := anything.(type) {
case string:
fmt.Println(v)
case int32, int64:
fmt.Println(v)
case string:
fmt.Println(v)
case SomeCustomType:
fmt.Println(v)
default:
fmt.Println("unknown")
}
如果您正在寻找“为什么”的解释
给出了完整的答案,所以我不再重复
希望它有意义
PS:不要在这个问题上投反对票,在我看来这是合法的…你可以在函数本身中键入assert
func test(m interface{},key interface{}) bool { // Map is passed as reference
ma := m.(map[interface{}]interface{})
if _, ok := ma[key]; ok == false {
....
}
@但是我没有发现方法类型是错误的,我甚至没有强制方法类型,因为我只是打印函数的返回值。正如编译器所说,问题在于参数类型。之所以不能传递
map[string]int
,因为map[interface{}]interface{}
是因为string
,int
和interface{}
都有不同的数据结构string
是一个可能是64位的单指针,int
可能是有符号的64位值,然而interface{}
是两个命名指针的结构,以及您可以将string
和int
传递到interface{}的原因
是指golang的运行时在需要时使用隐式转换它。这意味着,如果你想将map[string]int
转换为map[interface{}]interface{}
,你必须调用runtime.convT2E
来转换所有键和值,当然,如果你编写代码来实现这一点,你就可以这样做,但golang的运行时不会自动完成。谢谢,这正是我需要的。是的,我厌倦了这些反对票。现在一切都被否决了…看起来游乐场链接不再有效,因为“由于法律原因无法使用”。