因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15

事实上,泛型是Go lang1.18的一大亮点,但为何我们要在后期才深入探讨它呢?用比喻来说,就像给一年级的小学生讲解王勃的《滕王阁序》,他们能有多大几率理解作者的抱负和失意情绪?恐怕很难。的确,若没有对Go lang的强类型语法一定的了解,就难以理解泛型这种与静态语言概念相悖的特性。什么是泛型?泛型,顾名思义,就是通用的类型。简单来说,它是在静态类型语言中使用动态类型语言特性的方法。比如,一个函数能实现两个字符串的合并,参数声明了字符串,也就不支持其他数据类型。但如果需要两个整数求和的函数呢?那就需要再写一个类似的函数,这样就影响了代码的逻辑复用性。泛型的意义在于,在相同的逻辑下,可以针对不同的数据类型进行泛用。在Go lang中,泛型使用 [] 来声明类型范围。如果是多个数据类型,可以使用|分隔。这里定义了一个泛型变量v,可以是整数、浮点或字符串。注意,由于参数类型未定,所以返回值也必须是泛型类型

go泛型的缺点

“劣势”:go是带垃圾回收的编程语言,因此不管go的stop the world的时间有多么短,延迟有多么小,依然属于这类语言,这就天然与c,cpp,rust间划清了界线。虽然go初衷是成为系统级编程语言,虽然go的性能可以满足99%的场合的需要,但不能否认的是在一些性能超级敏感的场合,选择go依然要慎重。go的另外一个“劣势”就是能玩的花样太少,崇尚一个事情只有一个或少数几种写法。这不符合某些开发人员炫技的心理需求。于是就被诟病为是资质平平的程序员才会去用的语言。go 1.18将加入泛型(类型参数),这算是

go泛型什么时候出

go泛型2022年出。Golang团队认为在类型系统和运行时的复杂性花费太大,还没找到可以和这个复杂性相抵的良好设计。内置的map和slice其实都有泛型的味道,加上可以用interface{}来构造容器,可以达到泛型的效果。所以目前为止还没有直接的支持泛型。Java语言泛型:在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换。而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

为什么 Go 语言没有泛型?

Go 语言没有泛型的原因有两个。第一个原因是泛型和其他特性一样不是只有好处,为编程语言加入泛型会遇到需要权衡的两难问题。语言的设计者需要在编程效率、编译速度和运行速度三者进行权衡和选择,编程语言要选择牺牲一个而保留另外两个。第二个原因是目前的多数泛型提案都有明显的缺陷,而且在 1.x 版本中,提升语言其他方面性能带来的收益比泛型带来的更多 。