小编Mar*_*ier的帖子

为什么Go中的maps.Keys()指定map类型为M?

我实现了一个函数来获取映射中的键(实际上有几个版本,针对不同的类型),我将其更新为在 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
}
Run Code Online (Sandbox Code Playgroud)

这是实验库版本

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
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,主要区别是额外的M ~map[K]V类型参数,我省略了它并直接用于map[K]V函数的参数类型。我的函数可以工作,那么为什么我需要经历添加第三个参数化类型的额外麻烦呢?

当我写我的问题时,我想我已经找到了答案:能够在实际上是映射的类型上调用函数,但没有直接声明为这样,就像在这种DataCache类型上一样:

type DataCache map[string]DataObject
Run Code Online (Sandbox Code Playgroud)

我的想法是,这可能需要~map符号,并且~ …

generics go

7
推荐指数
1
解决办法
4446
查看次数

标签 统计

generics ×1

go ×1