您现在的位置是:亿华云 > 数据库
你还不体验泛型吗?
亿华云2025-10-04 01:09:33【数据库】9人已围观
简介介绍之前有看过官方发布的一些泛型文章,但是没动手玩过。还有没动手的吗,那么最后一班车了。不管学什么入门先从官网拿例子。这段代码很简单,定义两个函数,计算对应传入的map值的和。两个函数最大的不同在于函
介绍
之前有看过官方发布的体验一些泛型文章,但是泛型没动手玩过。还有没动手的体验吗,那么最后一班车了。泛型
不管学什么入门先从官网拿例子。体验
这段代码很简单,泛型定义两个函数,体验计算对应传入的泛型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
很赞哦!(6)
下一篇: 4、参加域名拍卖会
相关文章
- 在众多公司中,如果我们必须选择一家可信的公司,那当然是信得过的。
- 怎么才能快速识别好的域名?有什么特别的技巧?
- 新手如何选择域名注册平台?怎么选择域名注册平台比较好
- ooo是哪国域名?如何看待ooo域名后缀?
- 5、企业注册国内域名需要证件,其它情况一律不需要证件。
- wang域名值得购买吗?新手要了解wang域名哪些?
- 用户在挑选好域名时怎么做?新手域名选择须知什么?
- 企业应该需要怎样的域名?新企业选域名取决什么方面?
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 什么是高权重域名?去哪购买高权重域名?