考虑一个求和函数sum
如果参数是不同的类型,就需要写不同的函数,go中没有函数是一个变量,函数名不能一样:
这样很耗费人力,逻辑也重复了。这时, 泛型就登场了。
先定义一个泛型约束Number
限制Number
必须是数值类型
定义泛型函数
在函数名好使用泛型约束,T Number]
, 表明T必须是数组类型。这样就可以传入各自数组类型了:
输出
我们实现一个先进后出的栈来说明。把栈想象成你洗的碗,碗是叠起来的,最下面的碗是第一个放进去的,但是是最后一个拿出来洗,这就是先进后出。
定义一个栈结构体 Stack
, 可以存放任意类型。
泛型在结构体名称后面使用[T any]
表明T可以是任意类型。它包含一个[]T
类型的切片。
创建一个新建这个栈的函数:
实现入栈的方法Push
,入栈就在切片结尾增加元素即可。
泛型结构体的方法如上写,因为结构体已经自带泛型T
了。
实现出栈的方法Pop
:
好的,我们来调用一下:
输出
完整代码:
有泛型结构体,当然就要泛型接口:
我们给上面的栈抽象一个接口
这就是泛型接口,也是把泛型约束[T any]
放着接口名后面,表明T
可以是任意类型。
上面的stack
实现了这个接口: