QCon北京|3天沉浸式学习,跳出信息茧房。 了解详情
写点什么

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:138343

评论 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
回复
没有更多了
发现更多内容

2024年金三银四Java初中高级面试1000问,覆盖一线大厂各种面试痛点

采菊东篱下

编程 程序员 java面试

云原生与低代码:重塑软件开发新生态

快乐非自愿限量之名

云计算 云原生 软件开发 低代码

深入理解 Docker Run 命令:从入门到精通

霍格沃兹测试开发学社

掌握 Docker PS 命令:轻松管理容器

霍格沃兹测试开发学社

好用的文本编辑器推荐

霍格沃兹测试开发学社

SD-WAN网络中,CPE设备的重要性与选择

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

面试官:说说volatile底层实现原理?

王磊

Java 面试

百度营销发布「生成商业新未来」特刊

科技热闻

任务系统之API子任务

快乐非自愿限量之名

接口 API 项目开发 任务系统

深入探析:云计算与边缘计算在软件开发中的应用与挑战

EquatorCoco

云计算 低代码 边缘计算 项目开发

电商卖家如何利用API获取用户行为数据

技术冰糖葫芦

API 文档 API 策略

文心一言 VS 讯飞星火 VS chatgpt (204)-- 算法导论15.3 3题

福大大架构师每日一题

福大大架构师每日一题

检测LED单元板的好坏的方法

Dylan

LED display LED显示屏 led显示屏厂家

合合信息入选上海市网信办“2023年度网络数据安全风险评估试点工作优秀单位”

合合技术团队

安全 数据安全 合合信息

小红书笔记详情API入门指南

技术冰糖葫芦

API 文档

SD-WAN技术:是挑战还是机遇?

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

超越传统模式:商品企划系统如何助力鞋服品牌创新突围?

第七在线

长期有效!开放原子基金会联合龙蜥社区推出的「人人都可以参与开源」学习赛上线

OpenAnolis小助手

开源 操作系统 龙蜥社区 开放原子 人人都可以参与开源

从 0 开始构建知识图谱的 5 个启动建议

悦数图数据库

知识图谱

利用观测云实现 Kubernetes 多集群可观测

观测云

k8s

跳槽必看MySQL索引:B+树原理揭秘与索引优缺点分析

王中阳Go

数据库 面试 金三银四 跳槽

国际盛会 | 蔚蓝创造亮相KEY ENERGY 2024能源展

科技热闻

SD-WAN对云服务的影响

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

杭州悦数受邀参加《大模型驱动的智能知识图谱》标准首次专家研讨会

悦数图数据库

Java面向对象之内部类的几类使用场景

快乐非自愿限量之名

Java 面向对象 开发语言 面向编程

集成专栏丨解析WSDL自动生成API

inBuilder低代码平台

开源 低代码 集成 连接器

轻松实现UniApp Xcode上传IPA无需Mac,appuploder一键上传助你高效开发!

NFT矩阵公排合约系统开发

l8l259l3365

MCtalk·CEO对话×影刀RPA丨不确定的周期,越要找到确定的竞争优势

ToB行业头条

数据中台与低代码:数字中国战略的关键技术

不在线第一只蜗牛

数据中台 低代码 开发语言 数字转型

程序员副业大赏:一边赚钱一边提升技能!

伤感汤姆布利柏

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