你还不体验泛型吗

简介: 你还不体验泛型吗

介绍


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


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


1668515177645.jpg


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


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


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

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


1668515189947.jpg


你确定这真的好吗


泛型函数


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


1668515229789.jpg


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


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

1668515257208.jpg

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


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


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


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


1668515246941.jpg


类型约束


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


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


1668515286344.jpg


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

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


但是如果我这样


1668515297506.jpg


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


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

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


1668515306261.jpg


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


应用


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

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


1668515325447.jpg


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


1668515337245.jpg


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


总结


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


附录


相关文章
|
5月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
4月前
|
安全 Java 开发者
谁说 JAVA 不懂爱?泛型来给你满满的类型安全感!
【6月更文挑战第28天】Java泛型,编程中的类型守护者,提供编译期类型检查,增强代码安全与可读。如`GenericBox<T>`示例,实现类型参数化,避免转换错误。泛型方法如`printArray<T>`,灵活处理不同数据。它简化代码,消除潜在错误,赋予开发者类型保障的爱,让编程之旅更安心。Java的泛型,是对其语言之爱的深刻表达。
21 0
|
5月前
|
存储 算法 程序员
C++模板编程与泛型技术探秘
这篇文章探讨了C++中的模板编程和泛型技术,这两种技术增强了代码复用和抽象能力。文章介绍了函数模板和类模板的概念,通过示例展示了如何定义和使用它们。泛型技术是一种编程范式,强调编写与类型无关的代码,提高代码复用性和灵活性。C++11后的版本通过类型萃取和变长模板参数进一步扩展了模板功能。模板和泛型广泛应用在数据结构、算法、库和框架的开发中,如STL。掌握这些技术有助于编写更高效、灵活的代码,并推动软件开发的创新和进步。
|
5月前
|
存储 JavaScript Java
Java编程基础 - 泛型
Java编程基础 - 泛型
36 0
泛型的高级运用,代码重构必须要了解的技巧
前言 泛型相信大家都不陌生,经常都会用到,像在一些集合类啊,一些开源框架啊,这种东西随处可见,如果不能好好理解的话,看起源码来也会增加了一点儿复杂度。 泛型的好处,扩展性强,低耦合业务内容,大幅度的减少重复代码。 本篇文章,基于对泛型有一定了解,想更进一步运用的朋友。
DHL
|
存储 算法 安全
90%的人都不懂的泛型,泛型的缺陷和应用场景
Kotlin 和 Java 的协变和逆变的区别和应用场景,数组协变的缺陷,Kotlin 和 Java 数组协变的不同之处
DHL
333 0
90%的人都不懂的泛型,泛型的缺陷和应用场景
|
JavaScript
手摸手一起学习Typescript第六天 - 泛型 Generics / 泛型约束 / 泛型与类和接口
手摸手一起学习Typescript第六天 - 泛型 Generics / 泛型约束 / 泛型与类和接口
|
Java 开发者
泛型类传参小助手-泛型通配符 | 带你学《Java面向对象编程》之六十五
泛型类在有效回避转型风险的同时,也带来了传参问题,所以Java提供了类型通配符来解决这个问题。
泛型类传参小助手-泛型通配符   |  带你学《Java面向对象编程》之六十五
|
C# 编译器 安全
|
安全 .NET C#
《C#2.0锐利体验系列课程》第一讲——泛型
一个简单的泛型示例: 定义: class Stack<T> {         private T[] store;         private int size;         public Stack()        {                 store = new T[10.
1784 0