我想创建一个泛型方法来从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
}
但我真的想不出来,所以我想知道这是否可能,如果不可能,为什么?
1条答案
按热度按时间sbdsn5lh1#
你几乎做到了。声明键类型为可比较的,并对值类型使用类型约束。
要处理命名的Map类型,请使用~ thing为Map类型包含一个约束。
H/T to Burak,因为他指出了现有的库函数。