2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

Nacos源码—Nacos配置中心实现分析(二)

量贩潮汐·WholesaleTide

Java 算法 Spring Boot

越来越多企业为AI焦虑,联想的“超级智能体”来得正是时候

Alter

连锁药店如何安全访问总部运营系统?贝锐花生壳带来解决方案

贝锐

内网穿透 ERP

闺蜜机行业市场销量涨超42%,小度科技持续领跑行业

科技大数据

从AI助手到个性化数字分身:WeClone & Second Me打造本地化、私有化的个性化AI代理系统

汀丶人工智能

人工智能

天翼云出席DCIC2025,“翼立方”创新力拉满!

天翼云开发者社区

智算中心 AIDC

BeeWorks企业即时通讯平台,支持国产化生态

BeeWorks

即时通讯

YashanDB 知识库|STATISTICS_LEVEL 设置为 ALL,性能掉到冰点?一条参数搞清楚根因

数据库砖家

数据库

PMC必须要懂的四个关键流程:生产、库存、交期全过程解析!

积木链小链

制造业 智能制造 中小企业 生产管理

云效 MCP Server:AI 驱动的研发协作新范式

阿里巴巴云原生

阿里云 云原生 云效

72小时AI生存挑战 After Party,喊你一起来玩儿!

声网

Apollo 可观测性最佳实践

观测云

Apollo

常见应用层DDoS攻击

天翼云开发者社区

安全 DDoS

破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代

阿里巴巴云原生

阿里云 AI 云原生

Ava:6 分钟语音聊天免费生成 MBTI 报告;字节发布图像理解与生成统一模型 Mogao丨日报

声网

从 OpenAPI 到 MCP:让企业 API 在 AI 助手中焕发新生

阿里巴巴云原生

阿里云 AI 云原生 Higress

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

阿里巴巴云原生

阿里云 云原生

什么是DDoS攻击?

天翼云开发者社区

安全 DDoS

Nacos源码—Nacos配置中心实现分析

量贩潮汐·WholesaleTide

Java 算法 Spring Boot

为什么说企业办公最好使用私有化部署的im即时通讯?

BeeWorks

即时通讯 IM

什么是API安全

天翼云开发者社区

安全

11.多用组合和少继承

杨充

AI工具如何一键生成图表?5个流行的图表生成软件盘点!

职场工具箱

人工智能 图表 AI软件 AIGC 可视化工具

阿里Java开发手册:编程规约、异常日志、单元测试、安全规 约、MySQL 数据库、工程结构、设计规约!

程序员高级码农

Java 程序员 java 技术提升

uniapp跨平台开发HarmonyOS NEXT应用初体验

幽蓝计划

鸿蒙跨平台开发

使用LLaMA-Factory快速训练自己的专用大模型

我再BUG界嘎嘎乱杀

人工智能 AI 大模型

突破Excel百万数据导出瓶颈:全链路优化实战指南

电子尖叫食人鱼

数据库 oracle Excel

头部 ERP 厂商如何快速切入 AI 赛道?YMatrix 落地实录

YMatrix 超融合数据库

人工智能 AI YMatrix ERP软件 ERP国产替代

历数Java虚拟机GC的种种缺点

不在线第一只蜗牛

Java

需求分析不好做?这门华为新课免费试听!

YG科技

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