我试图写这篇文章:
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 :(得分:0)
Go中的地图类型不covariant,因此与分配不兼容。此外,空接口interface{}
不提供泛型。在Go v1中,必须为要检查的每种具体地图类型实现KeyExists
函数。
正式地,给定类型为map[int]int
的映射,不可能将其分配给键或元素类型不同的映射,例如map[interface{}]interface{}
。即使基础键或元素类型本身可以相互分配(例如,可以将类型int
的值分配给类型interface{}
的值)也是如此。
请注意,您可以将任何映射分配给类型为interface{}
(example)的值,因为所有类型都实现了空接口。根据{{3}}上的语言规范规则,可以进行此类分配。但是,这不太可能有帮助。