go - 如何编写接受任何映射的函数

标签 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? 我推断 interface{} 应该在这里工作。

错误消息一半有用一半烦人,因为它指出我不能做某事但没有说明原因。

最佳答案

Go 中的 map 类型不是 covariant ,因此不兼容赋值。此外,空接口(interface) interface{} 不提供泛型。在 Go v1 中,您的 KeyExists 函数必须为您希望检查的每个具体 map 类型实现。

不那么正式,给定类型为 map[int]int 的映射,不可能分配给键或元素类型不同的映射,例如 map[interface{ }]接口(interface){}。即使底层键或元素类型本身是可相互分配的(例如,可以将 int 类型的值分配给 interface{} 类型的值,这仍然成立)。

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

关于go - 如何编写接受任何映射的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839450/

相关文章:

struct - Golang revel : Paginating a struct array

go - Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID

go - go获取golang包报错 "use of an internal package not allowed"怎么办?

go - beego中如何指定自定义迁移表

go - 如何读取文本文件?

mongodb - 生产中的MongoDB中的白名单IP地址

regex - Golang : Why does regexp. FindAllStringSubmatch() 返回 [][]string 而不是 []string?

validation - Golang 验证器多字段依赖

go - go语言中的时间转换问题

Docker - Golang 找不到包