点击上方蓝色“Golang来啦”关注我哟
加个“星标”,天天 15 分钟,掌握 Go 语言
你好,我是四哥。
3 月 15 号,Go1.18 发布,这么多年来讨论最多的泛型终于正式 realse,可以说是近几年最大的特性变更。
既然已经正式发布,肯定是要来尝鲜的,宠粉的四哥当然也是要给大家安排上的,安排!
今天我们要实现的函数功能是:对 map 里所有的 value 求和。
非泛型函数
如果没有泛型该如何实现呢?因为 value 可能会有不同的类型,比如:int64、float64 等,没有泛型的话,针对不同类型需要通过不同的函数来实现,所以我们一般都会像下面这样实现:
func SumInts(m map[string]int64) int64 {
var s int64
for _, v := range m {
s += v
}
return s
}
func SumFloats(m map[string]float64) float64 {
var s float64
for _, v := range m {
s += v
}
return s
}
上面的代码,我们定义了两个函数:
1、SumInts() 计算 value 为 int64 类型的总和;2、SumFloats() 计算 value 为 float64 类型的总和;
上面函数只适用于 int64、float64 类型,那如果我们还想计算 int、float32 等,就得把上面的函数重新 copy 一份修改下类型。
这样做岂不是稍显麻烦,而且代码很臃肿,你还别说,之前标准包有很多类似的代码,比如标准库的 Sort 包(sort.go) 为了实现不同类型切片的排序,定义了 IntSlice、Float64Slice、StringSlice。
因为之前 Go 版本不支持泛型,只能这样实现,这也是最简单的一种方法。
有了泛型之后,针对不同类型 int64、float64,该如何实现一个函数就能计算出 value 的总和呢?
泛型函数
这一小节我们通过一个泛型函数实现既可以接收 value 为 int64 类型的 map 作为参数,也可以接收 value 为 float64 类型的 map 作为参数。
完整代码如下:
func Sum[K comparable, V int64 | float64](m map[K]V "K comparable, V int64 | float64") V {
var s V
for _, v := range m {
s += v
}
return s
}
func main() {
ints := map[string]int64{
"first": 1,
"second": 2,
}
fmt.Println(Sum[string, int64](ints "string, int64"))
floats := map[string]float64{
"first": 35.98,
"second": 26.99,
}
fmt.Println(Sum[string, float64](floats "string, float64"))
}
上面的代码,我们定义了 Sum() 函数,它是一个泛型函数,可以看到与普通函数不同的是,在函数名与函数参数列表之间有一组方括号 [],方括号里有两个参数 K 和 V,Go 语言里称为类型参数,紧跟在 K、V 后面是类型限制,其中 comparable 是 Go 语言预声明的,表示任何能做 == 和 != 操作的类型。V 的类型限制是 int64、float64 其中的一种。函数参数是 m,类型是 map[K]V,返回类型是 V。
调用函数也与调用普通函数有点不同,在函数名与实参之间有一组方括号 [],指明了类型名称。比如第一次调用 Sum() 函数时,类型名称分别是 string、int64,那么在执行函数时,对应 K、V 的类型分别是 string 和 int64。
第二次调用该 Sum() 函数时,K、V 的类型分别是 string 和 float64。
通过泛型编程,我们就可以实现一个函数处理多种数据类型。
执行上面的代码输出:
3
62.97
这篇文章我们通过一个简单示例入手泛型编程,关于泛型的语法、相关概念(比如类型参数、类型限制、类型推到等),四哥会在后续的文章里给大家讲解,抓紧学起来,没准还能在同事面前装 X 呢!
资料下载
点击下方卡片关注公众号,发送特定关键字获取对应精品资料!
-
回复「电子书」,获取入门、进阶 Go 语言必看书籍。
-
回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!
-
回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。
-
回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。
-
回复「后台」,获取后台开发必看 10 本书籍。
对了,看完文章,记得点击下方的卡片。关注我哦~ ???
如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!
文章评论