代码之家  ›  专栏  ›  技术社区  ›  Tommy

golang:接受任何映射的函数

go
  •  0
  • Tommy  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我试着写这个:

    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? 我推断接口应该在这里工作。

    错误消息有一半是有用的,一半是恼人的,因为它说明我不能做什么,但不能说明原因。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Cosmic Ossifrage    6 年前

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

    不太正式,给出一个类型的地图 map[int]int ,无法分配给键或元素类型不同的映射,例如 map[interface{}]interface{} . 即使基础键或元素类型本身是可以相互分配的(例如,可以分配类型的值 int 到类型的值 接口 )

    注意你 可以 将任何映射赋给类型的值 接口 ( example ,因为所有类型都实现了空接口。根据语言规范中关于 assignability . 然而,这不太可能有帮助。