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{}

您可以这样做,WARE
anything
是使用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的运行时不会自动完成。谢谢,这正是我需要的。是的,我厌倦了这些反对票。现在一切都被否决了…看起来游乐场链接不再有效,因为“由于法律原因无法使用”。