你还不体验泛型吗?

开发 前端
这篇文章主要带你们体验下泛型的基本使用,以及对应的类型约束,最后还简单实验了两个泛型的场景demo,感兴趣的可以自行体验。

介绍

之前有看过官方发布的一些泛型文章,但是没动手玩过。还有没动手的吗,那么最后一班车了。

不管学什么入门先从官网拿例子。

这段代码很简单,定义两个函数,计算对应传入的map值的和。

两个函数最大的不同在于函数参数类型有所不同,一个map的值类型为int64,一个为float64,对应返回参数也有所不同。

在没有泛型的情况下,每种类型都不得不重新定义一个函数。

有人可能会说,上面的代码你可以这样写在一个函数里,

你确定这真的好吗?

泛型函数

但是,有了泛型之后,那就简单多了。

上面这段代码中,定义了一个新函数SumIntsOrFloats,该函数声明两个类型参数 [K comparable, V int64 | float64]。其中K指定了类型必须为可比较(即可以用作比较符 == 和 !=)。

因为 go中规定map的key必须是可比较类型。比如,我们不能这样声明一个map。

所以这里的K就不能使用any关键字。

另一个V参数指定了一个约束,该约束由int64和float64组成,使用 | 指定了联合类型。

所以函数中m参数为map[K]V类型,K,V即为参数类型指定的类型。

假如你传入的map值的类型为其他类型。比如下面这种就不行了。

类型约束

上面看到的是我们在方法上对参数做一些约束。

当然我们也可以直接声明类型约束。

上面的代码声明了一个Number用做类型约束的接口类型。在接口里声明int64和float64联合类型。

在SumNumbers中如果约束类型为int64或者 float64,那么只需要使用Number类型约束即可,就不用每个不同函数写 int64 | float64,达到代码复用的效果。

但是如果我这样,

我们把map中的值类型调整为自定义的otherInt64类型,otherInt64的基础类型也是int64。但是,这段代码编译会报错。

原因是 int64 约束会将其限制为只能是该类型,也就是只能是int64,不能是基于此类型定义的其他类型。

如果想使用otherInt64咋么办,很简单,只需要一个~符号,

使用带~xxtype会将其限制为基础类型为xxtype的所有类型。

应用

以上只是简单介绍了一下泛型的使用姿势,那么哪些场景下可以使用泛型呢?

日常开发中,像slice、map、channel的一些处理函数,可能逻辑相同但是类型不同导致copy多个不同函数,这时候可以用泛型解决。比如,

还有一些行为方面的。例如go中的排序,通过泛型,不需要每一个结构都实现(Len,Less,Swap)三个方法,而是抽象出依赖于三个方法的行为。最终实现排序只需要依赖定义的这个抽象就行了。

其他方面的应用可以自行体验。

总结

这篇文章主要带你们体验下泛型的基本使用,以及对应的类型约束,最后还简单实验了两个泛型的场景demo,感兴趣的可以自行体验。更多内容,欢迎留言区域交流。

附录

https://go.dev/doc/tutorial/generics

 

https://teivah.medium.com/when-to-use-generics-in-go-36d49c1aeda

 

责任编辑:武晓燕 来源: RememberGo
相关推荐

2022-02-22 08:25:51

typeScript泛型概念泛型使用

2022-09-15 14:04:07

Go语言泛型

2023-11-08 08:27:30

泛型Java

2021-10-17 13:10:56

函数TypeScript泛型

2021-12-01 09:31:13

安全

2024-04-23 08:23:36

TypeScript泛型Generics

2021-03-01 07:34:42

Java泛型ArrayList

2021-02-08 11:20:27

Java类型数组

2021-02-26 05:20:42

Java参数化泛型

2021-09-29 18:17:30

Go泛型语言

2021-10-29 10:55:07

Go 泛型语言

2009-09-25 10:03:51

Java泛型

2024-10-14 08:31:41

泛型策略模式

2012-04-27 09:18:18

Ubuntu 12.0

2021-06-17 06:51:32

Java泛型Java编程

2022-04-28 12:00:34

Go泛型版排序

2024-10-28 00:40:49

Go语法版本

2010-01-06 10:43:49

.NET Framew

2021-12-30 19:34:15

Java泛型JDK

2009-08-26 09:36:03

C#泛型
点赞
收藏

51CTO技术栈公众号