类型参数推导
引入类型参数后,Go 可以编写泛型函数,来处理不同类型的数据。举个例子,MapKeys 函数可以获取任意 map 键列表:
1
2
3
4
5
6
7
|
func MapKeys[Key any, Value any, Map map[Key]Data](m Map) []Key {
keys := make([]Key, 0, len(m))
for key, _ := range m {
keys = append(keys, key)
}
return keys
}
|
调用泛型函数时,如果类型参数可以根据函数参数推导出来,则无需指定:
1
2
|
var m map[string]string
MapKeys(m)
|
有时,我们需要绑定类型参数,得到一个特化的版本,例如:
1
|
var StringMapKeys = MapKeys(string, string, map[string]string)
|
实际上,第三个类型参数可以根据前两个推导出来,因此我们可以这样简化:
1
|
var StringMapKeys = MapKeys(string, string)
|
实际上,泛型函数类型参数位置排列也是有技巧的,类型信息丰富的参数应该排前面:
1
2
3
4
5
6
7
|
func MapKeys[Map map[Key]Data, Key any, Value any](m Map) []Key {
keys := make([]Key, 0, len(m))
for key, _ := range m {
keys = append(keys, key)
}
return keys
}
|
Map 类型参数同时包含 Key 和 Value 的类型信息,因此它的信息量是最大的。将它排在前面,那么它自己的类型定了,那么 Key 和 Value 的类型都可以推导出来,少写一个类型参数:
1
|
var StringMapKeys = MapKeys(map[string]string)
|
【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注: