终于!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>
相关文章
|
3月前
|
算法 Go
Go 语言泛型 — 泛型语法与示例
本文详解 Go 语言泛型语法与使用示例,涵盖泛型函数、类型声明、类型约束及实战应用,适合入门学习与开发实践。
|
3月前
|
存储 安全 算法
Go语言泛型-泛型对代码结构的优化
Go语言自1.18版本引入泛型,极大提升了代码的通用性与可维护性。通过泛型,开发者可以减少重复代码、提高类型安全性,并增强程序的复用性和可读性。本文详细介绍了泛型在数据结构、算法及映射功能中的应用,展示了其在优化代码结构方面的优势。同时,Go编译器对泛型代码进行类型推导,确保运行时性能不受影响。合理使用泛型,有助于构建更加灵活高效的程序。
|
3月前
|
人工智能 Go
GO语言之泛型应用
本文介绍了Go语言中泛型的使用,包括为何引入泛型、泛型语法详解以及如何自定义约束。通过实例展示了泛型在简化代码、提高复用性方面的优势,并演示了泛型在slice、指针、map等数据类型中的应用。
|
3月前
|
分布式计算 算法 安全
Go语言泛型-泛型约束与实践
Go语言中的泛型约束用于限制类型参数的范围,提升类型安全性。通过接口定义约束,可实现对数值类型、排序与比较等操作的支持。开发者既可使用标准库提供的预定义约束,如constraints.Ordered和constraints.Comparable,也可自定义约束以满足特定需求。泛型广泛应用于通用数据结构(如栈、队列)、算法实现(如排序、查找)及构建高效可复用的工具库,使代码更简洁灵活。
|
3月前
|
Linux Go 开发者
Go语言泛型-泛型约束与实践
《Go语言实战指南》介绍了如何使用Go进行交叉编译,即在一个操作系统上编译出适用于不同系统和架构的二进制文件。通过设置GOOS和GOARCH环境变量,开发者可轻松构建跨平台程序,无需在每个平台上单独编译。Go从1.5版本起原生支持此功能,极大提升了多平台部署效率。
|
6月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
105 0
|
自然语言处理 搜索推荐 Go
goctl 技术系列 - Go 模板入门
goctl 技术系列 - Go 模板入门
|
分布式计算 安全 Java
简单易懂的 Go 泛型使用和实现原理介绍
简单易懂的 Go 泛型使用和实现原理介绍
|
11月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
1048 1
|
安全 Java Go
Java&Go泛型对比
总的来说,Java和Go在泛型的实现和使用上各有特点,Java的泛型更注重于类型安全和兼容性,而Go的泛型在保持类型安全的同时,提供了更灵活的类型参数和类型集的概念,同时避免了运行时的性能开销。开发者在使用时可以根据自己的需求和语言特性来选择使用哪种语言的泛型特性。
177 7

热门文章

最新文章