使用map [string] int作为类型map [interface {}] interface {}

时间:2017-02-23 10:45:48

标签: 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 {} in argument to ReturnTuples

由于stringint同时实施interface{}无法运作?

我已经搜索过,我能找到的最好的是Convert map[interface {}]interface {} to map[string]string,但它无法回答为什么我不能使用m作为参数。

我也相信,如果函数的参数只是interface{},它也会起作用,因为map[something][something]实现interface,对吧?最好的方法是什么,为什么它不能在我的案例中工作?

2 个答案:

答案 0 :(得分:7)

解决您的问题,只需将地图作为空接口的空接口启动:

m := map[interface{}]interface{}

然后您可以在' ReturnTuples'中分配您想要的任何类型键或值。功能

playground example

注意:请记住,如果您希望稍后将这些值用作原始类型,则需要使用类型断言,因为现在它们的类型为interface{}

你可以这样做,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")
}

如果您正在寻找"为什么" @ymonad给出了完整的答案,所以我不再重复了。

希望它有意义

PS:不要对这个问题进行投票,这是我眼中的合法投票......

答案 1 :(得分:0)

您可以在函数本身中键入assert。

func test(m interface{},key interface{}) bool { // Map is passed as reference
        ma := m.(map[interface{}]interface{})
        if _, ok := ma[key]; ok == false {
        ....
}