This question already has an answer here:
I tried writing this:
func KeyExists(m map[interface{}]interface{}, k interface{}) bool {
if _, ok := m[k]; ok {
return true
}
return false
}
When trying to run this with an m[int]int
, I get:
cannot use xxx (type map[int]int) as type map[interface {}]interface {} in argument to KeyExists
Why? From this: How do you make a function accept multiple types in go? I infer that interface{} should work here.
The error message is half helpful and half annoying, since it states I cannot do something but not why.
</div>
Map types in Go are not covariant, and therefore not assignment compatible. Moreover, the empty interface, interface{}
, does not provide generics. In Go v1, your KeyExists
function must be implemented for each concrete map type you wish to inspect.
Less formally, given a map of type map[int]int
, it is not possible to assign to a map whose key or element types are dissimilar, such as map[interface{}]interface{}
. This holds even if the underlying key or element types are themselves mutually assignable (e.g. it is possible to assign a value of type int
to a value of type interface{}
).
Note that you can assign any map to a value of type interface{}
(example), because all types implement the empty interface. Such assignments are permitted according to the language spec's rules on assignability. However, this is unlikely to be helpful.