我实现了一个函数来获取映射中的键(实际上,对于不同的类型,有几个版本),我在Go 1.18中更新了该函数以使用泛型.然后我发现实验库被扩展以包含该功能,虽然我的实现几乎相同,但函数声明有一些差异,我想更好地理解.
这是我最初的通用版本(我重命名了变量以匹配标准库,以便更好地突出显示was实际上是不同的):
func mapKeys[K comparable, V any](m map[K]V) []K {
r := make([]K, 0, len(m))
for k := range m {
r = append(r, k)
}
return r
}
func Keys[M ~map[K]V, K comparable, V any](m M) []K {
r := make([]K, 0, len(m))
for k := range m {
r = append(r, k)
}
return r
}
如您所见,主要的区别是额外的M ~map[K]V
类型参数,我省略了它,并直接使用map[K]V
作为函数的参数类型.我的函数可以工作,那么为什么我需要额外的麻烦来添加第三个参数化类型呢?
当我写我的问题时,我想我已经找到了答案:能够在类型上调用函数,这些类型实际上是隐藏的映射,但不是直接声明的,比如在这个DataCache
类型上:
type DataCache map[string]DataObject
我的 idea 是,这可能需要~map
符号,~
符号只能用于类型约束,而不能用于实际类型.这个理论唯一的问题是:我的版本在这种 map 类型上运行良好.所以我不知道它有什么用处.