我有一个功能:
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{}
,
我已经搜索过,我能找到的最好的是Convert map[interface {}]interface {} to map[string]string,但它无法回答为什么我不能使用m
作为参数。
我也相信,如果函数的参数只是interface{}
,它也会起作用,因为map[something][something]
实现interface
,对吧?最好的方法是什么,为什么它不能在我的案例中工作?
答案 0 :(得分:7)
解决您的问题,只需将地图作为空接口的空接口启动:
m := map[interface{}]interface{}
然后您可以在' ReturnTuples'中分配您想要的任何类型键或值。功能
注意:请记住,如果您希望稍后将这些值用作原始类型,则需要使用类型断言,因为现在它们的类型为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 {
....
}