HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

12 年后,Go 终于默认支持泛型

  • 2021-08-24
  • 本文字数:1293 字

    阅读完需:约 4 分钟

12年后,Go终于默认支持泛型

根据 Go 语言社区发布的 2020 年度调查报告表明,88% 的受访者认为泛型是 Go 缺失的关键特性。

Go 默认支持泛型


近日,Go 项目代码仓库提交和合并的一个 PR 显示,Go 语言已在 cmd/compile 中默认启用 -G=3,可使用新的 types2 类型检查器并支持类型参数。这意味着,Go 编译器正式启用了对泛型的支持。根据描述,在此之前,cmd/compile 的 -G flag 默认值为 0。



事实上,在上周 Go 1.17 发布时,就有开发者发现泛型代码已被合并,只是默认不启用。而随着 -G flag 默认值由 0 改成 3,加速奔跑的 Go 终于倾听广大开发者的声音,支持泛型。


Go 语言起源于 2007 年,并于 2009 年正式发布。在这十余年中,向 Go 语言添加泛型的讨论一直持续着。有开发者悲观地认为,Go 语言可能永远都不会加入泛型了。


根据 Go 语言社区发布的 2019 年度调查报告表明,79% 的受访者认为泛型是 Go 缺失的关键特性。而在 2020 年的开发者调查报告中,这一比例达到了 88%。此外,还有 18% 的受访者表示,由于缺少泛型而不会用 Go。


2019 年 7 月底,Go 团队发布了 Go 2 泛型设计的草稿 Contracts - Draft Design,这个设计草稿建议增加参数多态来扩展 Go 语言。


2020 年 6 月下旬,Go 团队发布了关于泛型的最新设计草案,此后一直在完善相关工作,并将注意力转移到生产就绪版本的实现身上。Go 团队称,“我们将在 2021 年年内继续努力,力争在年底前为大家带来一些可供试用的成果,也许会以 Go 1.18 beta 的形式发布。”


2021 年 1 月,Go 团队核心成员 Ian Lance Taylor 宣布已提交为 Go 添加泛型的提案,并表示“为 Go 添加泛型的语言变更完全向后兼容,现有的 Go 程序会继续像现在一样正常运行。”


这是 Go 泛型特性的又一步历史性前进。根据 Go 官方消息,Go 1.18 中将正式启用泛型。

为什么 Go 语言没有泛型?


从诞生到现在,12 年的 Go 为什么一直没有泛型


简单来说有以下两点原因:


  1. 泛型困境是所有编程语言都需要面对的,也是加入泛型之前不得不深思熟虑的问题;

  2. 目前的多数泛型提案都有明显的缺陷,而且在 1.x 版本中,提升语言其他方面性能带来的收益比泛型带来的更多。


一方面,泛型和其他特性一样,不是只有好处,也有坏处,为编程语言加入泛型会遇到需要权衡的两难问题。语言的设计者需要在编程效率、编译速度和运行速度三者进行权衡和选择,编程语言要选择牺牲一个而保留另外两个。


泛型困境,图片来源:Draveness 技术网站


当我们考虑是否应该支持泛型时,实际上需要考虑的问题是:我们应该牺牲工程师的开发效率、牺牲编译速度和更大的编译产物还是牺牲运行速度。


泛型的引入一定会影响编译速度和运行速度,同时也会增加编译器的复杂度,所以社区在考虑泛型时也非常谨慎。Go 2 的泛型提案在面对这个问题时没有进行选择,让具体实现决定是应该影响编译速度(单独编译不同的类型参数)还是运行时间(使用方法调用在运行时决定具体执行的函数)。


另一方面,社区中的大部分泛型提案都有各自的缺陷,所以不会被 Go 团队采纳,同时向 Go 语言中加入泛型并不是团队的首要工作,所以 Go 语言发布 10 多年以来一直都没有支持泛型。


当前,虽然 Go 编译器已默认启用 -G=3,但 -G=0 模式仍在测试中。对于渴望支持泛型的开发者来说,一起期待明年的 Go 1.18 吧。

2021-08-24 00:138163

评论 5 条评论

发布
用户头像
interface 飞起了
2021-08-30 09:17
回复
用户头像
不出泛型不用,Java还凑合能用
2021-08-27 10:53
回复
用户头像
文中配图注明下来源吧

2021-08-24 13:31
回复
感谢提醒,已标注哈
2021-08-24 14:04
回复
用户头像
文中配图注明下吧
2021-08-24 13:31
回复
没有更多了
发现更多内容

Web 富文本编辑器之 Android 输入兼容

爱吃小舅的鱼

Web 富文本编辑器 Android 输入兼容

2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度) 然后输出该节点的值。(如果节点的深度为 D,则其

福大大架构师每日一题

Go 算法 rust 福大大架构师每日一题

中国科学院院士梅宏:推进构建面向全球的开源生态治理体系

开放原子开源基金会

开源 开放原子 梅宏

海纳 “千川”:得物多场景统一推荐平台

得物技术

OneCode-流程引擎设计

codebee

对线面试官-Sychronized和ReentrantLock

派大星

Java 面试题

C语言编程—命令行参数

梦笔生花

C语言 命令行参数解析 6 月 优质更文活动

深入理解Pod的核心知识

穿过生命散发芬芳

pod 6 月 优质更文活动

行业翘楚论道未来想象|2023开放原子全球开源峰会云原生分论坛圆满落幕

开放原子开源基金会

开源 云原生 开放原子

ubuntu服务器安装图形化界面总结

Studying_swz

6 月 优质更文活动

TS接口类型

不叫猫先生

6 月 优质更文活动

PDF Expert for mac:pdf编辑工具中文最新

背包客

macos PDF Mac软件 PDF Expert PDF Expert for Mac

加速44%!RT-DETR量化无损压缩优秀实战

飞桨PaddlePaddle

人工智能 百度 paddle

精打细算:OptaPlanner如何帮助您找到最佳优惠券组合

PeterOne

算法 运筹优化 6 月 优质更文活动

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

股市老人

手势识别技术的挑战和未来发展

来自四九城儿

当 GraphQL 遇上图数据库,便有了更方便查询数据的方式

NebulaGraph

图数据库 graphql

智达方通EPM 发布5.0版本,持续赋能企业数智化管理

智达方通

EPM 智达方通 全面预算管理 智达方通EPM 企业绩效管理系统

基于STM32设计的智能灌溉控制系统

DS小龙哥

6 月 优质更文活动

柏睿向量存储查询引擎基于LLM实现特定垂直领域的知识问答功能

新消费日报

激活SBOM内生价值 推动供应链体系建设健康有序|2023开放原子全球开源峰会软件物料清单(SBOM)分论坛成功举办

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 软件物料清单(SBOM)

架构模块2作业

sandywrh

用Optaplanner实现云资源优化:建模详解

PeterOne

算法 后端 运筹优化 6 月 优质更文活动

Generative AI 新世界:文本生成领域论文解读

亚马逊云科技 (Amazon Web Services)

机器学习

WMS 库存系统设计

红袖添香

系统设计 供应链物流 WMS系统 库存系统

Seata Saga 模式快速入门和最佳实践

SOFAStack

分布式 云原生 开发 seata Seata框架

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

BlockChain先知

JS中, Set为什么是带键的集合?

林十二XII

前端

MySQL8新特性窗口函数详解

越长大越悲伤

MySQL sql

以商业实践反哺开源技术跃升|2023开放原子全球开源峰会开源商业化创新发展分论坛成功举行

开放原子开源基金会

开源 开源商业化 开放原子全球开源峰会

12年后,Go终于默认支持泛型_编程语言_凌敏_InfoQ精选文章