如何编写接受任何地图的函数

时间:2019-04-24 22:33:02

标签: go

我试图写这篇文章:

func KeyExists(m map[interface{}]interface{}, k interface{}) bool {
    if _, ok := m[k]; ok {
        return true
    }
    return false
}

尝试使用m[int]int运行此命令时,我得到:

cannot use xxx (type map[int]int) as type map[interface {}]interface {} in argument to KeyExists

为什么?由此:How do you make a function accept multiple types in go? 我推断该接口{}应该在这里工作。

该错误消息既有帮助,也有令人讨厌的一半,因为它指出我无法执行某项操作,但为什么却不能。

1 个答案:

答案 0 :(得分:0)

Go中的地图类型不covariant,因此与分配不兼容。此外,空接口interface{}不提供泛型。在Go v1中,必须为要检查的每种具体地图类型实现KeyExists函数。

正式地,给定类型为map[int]int的映射,不可能将其分配给键或元素类型不同的映射,例如map[interface{}]interface{}。即使基础键或元素类型本身可以相互分配(例如,可以将类型int的值分配给类型interface{}的值)也是如此。

请注意,您可以将任何映射分配给类型为interface{}example)的值,因为所有类型都实现了空接口。根据{{​​3}}上的语言规范规则,可以进行此类分配。但是,这不太可能有帮助。