初识go泛型

138 阅读2分钟

什么是泛型

Go 是一门强类型语言,意味着程序中的每个变量和值都有某种特定的类型,例如intstring 等。在函数签名中,我们需要对参数和返回值指定类型,例:

func test(a int, b string)string {} // 参数 a 为int,b为 string, 返回string

func test1(a string, b string) string {} // 当a为string时 就需要添加对应类型版本对应函数

泛型之前我们可以用 interface{} 来接收不同类型的参数,但使用interface后,具体什么类型还需使用element.(type)来判断很不友好。所以我们需要泛型来解决。

泛型定义

与其他语言的泛型不完全一致,Go 的泛型更类似 interface{},只是他会在编译器对代码进行处理
需要通过如下的形式,来声明泛型可以支持哪些参数,在后续使用过程中,需要保证所有对泛型的操作都满足这里对应的类型要

type Number interface{
	type int, int8, int16, int32, int64, 
		uint, uint8, uint16, uint32, uint64,
		float32, float64
}

泛型声明

// 函数ADD 相加两数类型为Number中任意,返回数据类型亦是
func Add[T Number](a, b T) T 
  • Add 后面的 [T Number],T 表示类型的标识,Number 表示 T 可以类型范围,[T any]表示T可以是任何类型
  • a、b 和返回值的类型 T 和前面的 T 是同一个类型
  • 为什么用 [],而不是其他语言中的 <>,官方有过解释,大概就是 <> 会有歧义。曾经计划使用 (),因为太容易混淆,最后使用了 []。

调用

Add(float32(1.0), float32(2.0))
Add([float32](1,2))

泛型的使用要注意该操作你定义的泛型类型是否能执行,例:

type duce interface{
	type int, string
}

func reduce[T duce](a,b T){
    return a-b
}

这时候代码会报错,因为并非duce里的所有类型都能执行 - 操作

总的来说,比较完整,实现了大部分的功能,相比于接口,有一定的差异。