go语言将要支持泛型啦

时间:2022-10-13 09:54:14


早晨浏览公众号,说预计GO将在1.18版本支持泛型,虽然编程多年,但对什么是泛型没什么认识,今天就整理一下什么是泛型,希望对大家也有帮助。

在计算机程序设计领域,为了避免因数据类型的不同,而*重复编写大量相同业务逻辑的代码,人们发展的泛型及泛型编程技术。

那么,什么是泛型呢?本节就带领读者深度剖析一下这个问题。

所以泛型,实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。

为了更好地说明使用具体数据类型有多么麻烦,这里先举个例子,假设客户需要一个函数,功能是返回两个 int 类型数据中较大的那个,很多读者自然而然会编写如下代码:

int maxt(int x, int y) { return (x > y) ? x : y; }

可是没过几天,该用户又提出需要编写一个返回两个 double 类型数据中较大的那个,于是我们需要之前的代码进行修改:

double maxt(double x, double y) { return (x > y) ? x : y; }

之后,该用户又提出需要再编写一个能返回两个 char 类型数据中较大的那个…。可以看到,只是因为数据类型不同,就迫使我们不得不把具有相同功能的代码写了若干遍,这样的实现方法简直令人崩溃。

为了解决类似的问题,有聪明的人将代码修改成如下的样子:

T maxt(T x, T y) { return (x > y) ? x : y; }

如此,当用户需要某个数据类型的 maxt 函数时,我们只需要把其中的 T 替换成用户需要的实际数据类型就行了。

那么,代码中的 T 是什么呢?很明显,这是一个占位符,更确切的说是一个类型占位符。也就是说,将来在 T 这个位置上的是一个真实、具体的数据类型,至于到底是哪个类型,完全取决于用户的需求。

当然,如果硬要给 T 这种类型占位符也叫做一种数据类型,提供这种想法的发明者称它为泛型(generic type),而使用这种类型占位符的编程方式就被称为泛型编程。

值得一提的是,既然泛型并不是真实的数据类型,那么使用泛型编写的代码也就不是真正的程序实体,只能算是一个程序实体的样板。故此,通常形象的将这种使用了泛型的代码称为模板,由模板生成实际代码的过程称为模板的具体实现。

注意,类型占位符的替换工作,不需要人为操控,可以完全交由计算机来完成,更准确的说,是交由编译器在编译阶段来完成模板的具体实现。

总之一句话,泛型也是一种数据类型,只不过它是一种用来代替所有类型的“通用类型”。在 中,用以支持泛型应用的就是标准模板库 ,它提供了 C++ 泛型设计常用的类模板和函数模板。

小结

泛型就是编写模板代码来适应任意类型;

泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查;