Go 是同java等一样是一门强类型语言,意味着程序中的每个变量和值都有特定的类型,例如int、string 等。在函数签名中,我们需要对参数和返回值指定类型。例如
func sum(a, b int) int { return a+b } func sumFloat(c, d float64) float64 { return a+b } func mergeStr(e, f string) string { return a+b }
从上面的例子可以看出,sum和sumFloat的函数方法体内容完全一致,只是受限于参数类型以及返回值类型,传统方式变得不得不多写一堆看似重复的代码,很不方便,也非常繁琐。业务逻辑简单的情况下可能还好,如果业务逻辑变得复杂了,需要同时维护多个`版本`的方法。增加了维护成本以及出错的概率。这时候泛型就应用而生。
Go则在1.18正式启用了泛型。简单来说(便于理解,可能不是非常准确),在定义函数时候,不便于区分他的参数类型或者返回值类型,用一个特定占位符类型表示
func sum[T int | float64](a, b T) T { return a + b }
方法sum定义了2个a,b 参数,类型为T,而 sum[T int | float64] 限定了 T的类型为int 或者float64,当然T的类型也可以为 任意类型any,由于不是所有的数据类型都支持sum加减法操作,故这里暂时限定了T的类型为int或者float64,避免了编写多个类型的函数。
这就是最简单的泛型。