类型参数推导
引入类型参数后,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语言】系列文章首发于公众号【小菜学编程】,敬请关注:
