终于!Go 1.18 将支持泛型,来听听Go 核心技术团队 Russ Cox怎么说

简介: 终于!Go 1.18 将支持泛型,来听听Go 核心技术团队 Russ Cox怎么说

近日,Go 语言核心开发团队技术主管 Russ Cox 在 golang-dev group 发了公开邮件,宣布称“如果没有意外情况,Go 1.18 将会支持泛型。”据悉,Go 1.18 版即将于2022年初发布。

yy.png

还记得10月初,本站刚刚报道了“Go语言之父”Rob Pike在github上关于“不建议在Go 1.18的标准库中使用泛型”issue的消息。当时,Rob Pike的担心是“Go 1.18版本承载了太多的change,容易出错”,所以建议先等待观察,稳步向前。

而到了10月28日的昨天,Russ Cox又发文针对 Rob Pike 的 issue,介绍了Go 1.18 版本与泛型目前的进展和后续的支持策略,这也终于确定了Go核心团队下阶段的方向——也就是说,如果不出意外的话,Go 1.18版本中将支持泛型。


加入泛型对于Go团队的意义

作为Go发布以来最重要的变化,Russ Cox在这封公开邮件中简单解释了泛型的加入对Go团队和用户的意义。yy.png

Russ Cox表示,任何Go的新功能特性,无论是语言还是库,都带有不确定性,包括不确定如何使用、如何不使用它们,以及有哪些微小的bug已经通过了现有的测试集。泛型也不能避免这种不确定性,特别是由于泛型是个大型的新功能,所以它的不确定性也会更大。

同时,在该团队最初发布的泛型代码–特别是通过提案程序的maps和slices包–将首先放在golang.org/x/exp中,但不能保证向后兼容。Russ Cox称,未来一旦有了更多的经验,会希望将其中一些包推广到标准库中(constraints包例外,它作为编写某些泛型代码的基础,将被添加到Go 1.18标准库中。)

Russ Cox 强调,Go 1.18与其他Go 1.x版本一样具有向后兼容的承诺,“不会破坏用Go 1.18构建的代码,包括使用泛型的代码。在最坏的情况下,如果我们发现Go 1.18的语义有一些致命的问题,并需要改变它们(例如在Go 1.19中),我们将使用go.mod文件的go版本指示符来确定该module中的源文件是使用Go 1.18还是Go 1.19+的语义。(我们预计不需要这样做!)”

对于不少急于采用泛型的软件包作者,Russ Cox建议称“如果您正在更新您的软件包以使用泛型,请考虑将新的泛型API隔离到自己的文件中,并为其使用Go 1.18的构建标签(//go:build go1.18),以便Go 1.17用户可以继续构建和使用非泛型部分。”

值得注意的是,第三方工具可能不会在Go 1.18发布时完全支持泛型。目前,Go核心团队正在与不少第三方工具的作者沟通,试图确保他们得到适当的更新,但他们都有自己的时间安排表。

对于“为什么不把泛型变成可选项加入Go 1.18?”的疑问,Russ Cox解释称,减少不确定性的唯一方法是让其默认可用。

“当我们在Go 1.5版本中让vendor机制作为可选项加入时,发现几乎没有人真正使用它,直到Go 1.6版本默认开启它。所以Go 1.5版本没有减少我们对Go开发者使用vendor情况的不确定性。另一方面,Go 1.5版本无疑将生态系统分为’在标准Go下运行的代码‘和 ’在启用vendoring后运行的代码‘两部分。我们希望在这里尽可能地避免这种结果。”


Go语言为什么需要泛型?

一直以来,业界关于Go语言泛型的话题讨论都非常激烈,而Go团队也一直对否加入泛型而犹豫不决,因为他们希望找到一种好的解决方案。

我们知道,函数式编程是一种非常流行的编程范式,在很多汇编语言类型里都有构建或支持。而对于Go语言来说,尽管并非是一种函数式语言,但它确实提供了一组允许函数式编程的特性(有相当数量的开源Go库提供功能特性集)。

函数式编程的语言支持范围从只支持函数式范式(如Haskell)到多范式+一流支持(如Scala、Elixir)再到多范式+部分支持(如Javascript、Go)。在后一类语言中,函数式编程一般通过使用社区创建的库来支持,这些库复制前两种语言的标准库中的部分或全部功能。

Go语言则属于最后一类,它可以实现下图中的功能编程:

yy.png

Russ Cox表示,任何Go的新功能特性,无论是语言还是库,都带有不确定性,包括不确定如何使用、如何不使用它们,以及有哪些微小的bug已经通过了现有的测试集。泛型也不能避免这种不确定性,特别是由于泛型是个大型的新功能,所以它的不确定性也会更大。

同时,在该团队最初发布的泛型代码–特别是通过提案程序的maps和slices包–将首先放在golang.org/x/exp中,但不能保证向后兼容。Russ Cox称,未来一旦有了更多的经验,会希望将其中一些包推广到标准库中(constraints包例外,它作为编写某些泛型代码的基础,将被添加到Go 1.18标准库中。)

Russ Cox 强调,Go 1.18与其他Go 1.x版本一样具有向后兼容的承诺,“不会破坏用Go 1.18构建的代码,包括使用泛型的代码。在最坏的情况下,如果我们发现Go 1.18的语义有一些致命的问题,并需要改变它们(例如在Go 1.19中),我们将使用go.mod文件的go版本指示符来确定该module中的源文件是使用Go 1.18还是Go 1.19+的语义。(我们预计不需要这样做!)”

对于不少急于采用泛型的软件包作者,Russ Cox建议称“如果您正在更新您的软件包以使用泛型,请考虑将新的泛型API隔离到自己的文件中,并为其使用Go 1.18的构建标签(//go:build go1.18),以便Go 1.17用户可以继续构建和使用非泛型部分。”

值得注意的是,第三方工具可能不会在Go 1.18发布时完全支持泛型。目前,Go核心团队正在与不少第三方工具的作者沟通,试图确保他们得到适当的更新,但他们都有自己的时间安排表。

对于“为什么不把泛型变成可选项加入Go 1.18?”的疑问,Russ Cox解释称,减少不确定性的唯一方法是让其默认可用。

“当我们在Go 1.5版本中让vendor机制作为可选项加入时,发现几乎没有人真正使用它,直到Go 1.6版本默认开启它。所以Go 1.5版本没有减少我们对Go开发者使用vendor情况的不确定性。另一方面,Go 1.5版本无疑将生态系统分为’在标准Go下运行的代码‘和 ’在启用vendoring后运行的代码‘两部分。我们希望在这里尽可能地避免这种结果。”


Go语言为什么需要泛型?

一直以来,业界关于Go语言泛型的话题讨论都非常激烈,而Go团队也一直对否加入泛型而犹豫不决,因为他们希望找到一种好的解决方案。

我们知道,函数式编程是一种非常流行的编程范式,在很多汇编语言类型里都有构建或支持。而对于Go语言来说,尽管并非是一种函数式语言,但它确实提供了一组允许函数式编程的特性(有相当数量的开源Go库提供功能特性集)。

函数式编程的语言支持范围从只支持函数式范式(如Haskell)到多范式+一流支持(如Scala、Elixir)再到多范式+部分支持(如Javascript、Go)。在后一类语言中,函数式编程一般通过使用社区创建的库来支持,这些库复制前两种语言的标准库中的部分或全部功能。

Go语言则属于最后一类,它可以实现下图中的功能编程:


            </div>
相关文章
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
运维 网络协议 安全
长连接网关技术专题(十):百度基于Go的千万级统一长连接服务架构实践
本文将介绍百度基于golang实现的统一长连接服务,从统一长连接功能实现和性能优化等角度,描述了其在设计、开发和维护过程中面临的问题和挑战,并重点介绍了解决相关问题和挑战的方案和实践经验。
146 1
|
1月前
|
IDE Go 开发工具
一文搞懂Go1.18泛型新特性
一文搞懂Go1.18泛型新特性
43 0
|
19小时前
|
SQL 关系型数据库 测试技术
技术经验分享:Go开源项目
技术经验分享:Go开源项目
|
1天前
|
编译器 Go C++
必知的技术知识:go语言快速入门教程
必知的技术知识:go语言快速入门教程
|
9天前
|
编译器 Go 开发者
Go语言进阶篇——泛型
Go语言进阶篇——泛型
|
11天前
|
缓存 编译器 Go
什么是go中的泛型
Go 语言在1.18版引入了泛型,旨在简化代码并提高复用性。泛型通过类型参数允许编写通用函数,如一个`Add`函数可以处理整数和浮点数的加法,减少了为不同类型编写重复代码的需求。类型约束(如`int`或`float64`)定义了类型参数适用的范围。编译器自动进行类型推导,简化调用。泛型可用于结构体(如创建泛型缓存)和其他场景,当逻辑相同但涉及不同类型时,可考虑使用泛型。注意泛型在处理自定义类型时,返回值可能是底层类型而非自定义类型,需通过类型约束来保持一致性。
|
1月前
|
算法 Java Go
【Go语言专栏】Go语言中的泛型编程探索
【4月更文挑战第30天】Go语言新引入的泛型编程支持使得代码更通用灵活。通过类型参数在函数和接口定义中实现泛型,如示例中的泛型函数`Swap`和泛型接口`Comparator`。泛型应用包括数据结构、算法实现、函数包装和错误处理,提升代码复用与维护性。这一特性扩展了Go语言在云计算、微服务、区块链等领域的应用潜力。
|
1月前
|
大数据 Java Go
Go语言在大数据处理中的核心技术与工具
【2月更文挑战第22天】本文深入探讨了Go语言在大数据处理领域的核心技术与工具。通过分析Go语言的并发编程模型、内存管理、标准库以及第三方工具库等方面,展现了其在大数据处理中的优势和实际应用。同时,本文也讨论了如何使用这些技术与工具构建高效、稳定的大数据处理系统,为开发者提供了有价值的参考。
|
1月前
|
存储 算法 Go
泛型在Go语言中的引入与实践
【2月更文挑战第19天】Go语言1.18版本引入了对泛型的原生支持,这一特性使得开发者能够编写更加通用和灵活的代码。本文将深入探讨Go语言中泛型的引入背景、使用方法和实践案例,帮助读者了解并应用这一强大的编程工具。