我实现了一个函数来获取映射中的键(实际上有几个版本,用于不同的类型),我更新它以在 Go 1.18 中使用泛型。然后我发现实验库已扩展以包含该功能,虽然我的实现几乎相同,但函数声明有一些我想更好地理解的差异。
这是我的原始通用版本(我重命名了变量以匹配标准库,以更好地突出显示实际上是不同的):
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
我的想法是,这可能需要~map符号,并且~只能在类型约束中使用,而不能在实际类型中使用。该理论的唯一问题是:我的版本在此类地图类型上运行良好。所以我不知道它有什么用。
繁花如伊
相关分类