在golang中,从参数推断类型是可能的吗?

ss2ws0br  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(111)

我想创建一个泛型方法来从map中提取键作为数组--这样数组的类型就应该与map中键的类型相同。我知道我想让用法看起来像这样:

mapWithStringKeys := map[string]string {
    "one": "1",
    "ten": "10",
    "hundred": "100",
}

mapWithIntKeys := map[int]string {
    1: "one",
    10: "ten",
    100: "hundred",
}

keys(mapWithStringKeys) // []string{"one", "ten", "hundred"}
keys(mapWithStringKeys) // []int{1, 10, 100}

提取密钥的内部逻辑如下所示:

keys := make([]<TYPE>, 0, len(mymap))
for k := range mymap {
    keys = append(keys, k)
}

我在定义函数时遇到了很多麻烦,golang知道如何“沿着”类型,我设想了这样的情况:

func keys[T infer](m map[T]any) []T {
    keysArr := make([]T, 0, len(mymap))
    for k := range mymap {
        keysArr = append(keysArr, k)
    }
    return keysArr
}

但我真的想不出来,所以我想知道这是否可能,如果不可能,为什么?

sbdsn5lh

sbdsn5lh1#

你几乎做到了。声明键类型为可比较的,并对值类型使用类型约束。

func keys[T comparable, V any](mymap map[T]V) []T {
    keysArr := make([]T, 0, len(mymap))
    for k := range mymap {
        keysArr = append(keysArr, k)
    }
    return keysArr
}

要处理命名的Map类型,请使用~ thing为Map类型包含一个约束。

func keys[M ~map[T]V, T comparable, V any](mymap M) []T {
    keysArr := make([]T, 0, len(mymap))
    for k := range mymap {
        keysArr = append(keysArr, k)
    }
    return keysArr
}

H/T to Burak,因为他指出了现有的库函数。

相关问题