Go语言程序开发小技巧

类型参数推导

引入类型参数后,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 类型参数同时包含 KeyValue 的类型信息,因此它的信息量是最大的。将它排在前面,那么它自己的类型定了,那么 KeyValue 的类型都可以推导出来,少写一个类型参数:

1
var StringMapKeys = MapKeys(map[string]string)

【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注: