十一年来,Go语言开源发布,未来将专注于Go模块和泛型

发表时间: 2020-11-12 10:18

Go 语言发布十一周年了。

回想Go语言的十周年庆典已经恍如隔世,2020年是艰难的一年,但我们一直在推动Go的发展,也带来了不少值得回忆的美好瞬间。

去年11月,我们在Go十岁生日后不久,启动了go.dev 与pkg.go.dev。

今年2月,Go 1.14版本带来Go模块的首个“生产就绪”实现,同时迎来一系列性能改进,包括用于减少调度并降低垃圾收集延迟的更快推迟速度及非合作goroutine抢占。

3月初,我们推出了新的协议缓冲区
APIgoogle.golang.org/protobuf,它大大提高了对协议缓冲区反射及自定义消息的支持能力。

面对突如其来的COVID-19疫情,我们决定在春季暂停所有公告或发布事宜,希望大家能够把注意力集中在抗疫这一头等大事上。但我们的前进脚步并未停止,Go团队中的一名成员加入了苹果/谷歌关于隐私保护的公开合作项目,负责在全球范围内支持联系人跟进工作。5月,开发团队又启动了用Go编写的参考后端服务器。

我们继续改进gopls,借此在多种编辑器中实现了对高级Go感知功能的支持。6月,VSCodeGo扩展正式加入Go项目,目前由负责gopls的同一位开发者进行维护。

同样是在6月,综合大家的反馈意见,我们对pkg.go.dev代码进行开源,并将其作为Go项目的组成部分。

6月下旬,我们发布了关于泛型的最新设计草案,附带一款原型设计工具与generics playground。

7月,我们发布并讨论了三套新的设计草案以供后续修改:用于文件选择的 //go:build行,文件系统接口以及build-time文件嵌入。(将在2021年正式推出。)

8月,Go 1.15版本主要提供优化与bug修复。最重要的是,我们开始重写链接器,使其运行速度提高了20%且在大型构建作业中的平均内存占用量降低了30%。

上个月,我们进行了年度Go用户调查。在完成分析之后,我们将把结果发布在博客上。

Go社区也开始逐步适应“虚拟优先”原则,今年以来我们先后参加并组织了多场线上形式的虚拟会议。上周,GO团队还在谷歌开源Live上举办了Go主题日活动。

Go 语言发布计划

明年2月,Go 1.16将包含新的文件系统接口与build-time文件嵌入。新版本还将完成对链接器的重写,借此带来更可观的性能改进。1.16版本也将提供对采用新一代苹果芯片(GOARCH = arm64)的Mac设备的支持。

明年8月,Go 1.17将带来更多功能与改进,但目前我们还无法确定太多细节。根据计划,1.17版本将提供一项针对x86-64、基于寄存器的新型调用约定(不影响现有指令集!),使得程序的整个运行流程变得更快。(其他架构将在未来的版本中发布。)此外该版本还将包含新的//go:build行,出错几率比现有//+build行更低。最后,我们还希望能够在明年对另一项备受期待的功能完成Beta测试,即支持gotest命令中的模糊测试。

Go 模块

明年之内,我们将继续致力于开发对Go模块的支持,并更好地将其集成到整个Go生态系统当中。Go 1.16将包含迄今为止最为流畅的Go模块体验。我们最近的一项调查已经得到初步结果,当前有96%的用户已经使用Go模块(高于去年调查中的90%)。

我们还将终止对基于GOPATH开发工作的支持。未来,使用标准库以外任何其他依赖项的程序,都需要配合go.mod。(如果您尚未进行模块切换,请参阅GOPATH维基页面以了解关于从GOPATH到模块的更多详细信息。

从起步之初,Go模块的目标就是“将软件包版本的概念融入Go开发者与我们工具的日常场景当中”,借此为整个Go生态系统中的模块及版本提供深度支持。事实上,Go模块的镜像、校验数据库以及索引在实现过程中也充分考虑到了整个生态系统范围内的软件包版本。明年,我们将在工具与系统当中推出更多丰富的模块支持选项。例如,我们有计划研究新的工具,帮助模块作者发布模块新版本(go release),并帮助他们更新那些依赖于过时API的代码(新的go fix)。

更重要的是,我们还创建了gopls以减少以往编辑器在支持Go时需要使用的多种工具。这类工具绝大多数不支持模块,因此必须加以替换。明年,我们将着手在VSCodeGo扩展中默认使用gopls,同时发布gopls1.0,希望为大家带来出色的模块体验。Gopls的一大优势在于,其具备编辑器中立性:任何能够理解该语言服务器协议的编辑器都可以正常使用。

版本信息的另一个重要用途,在于跟踪build中的各软件包是否存在已知漏洞。明年,我们计划开发一套已知漏洞数据库,外加与之配套的漏洞检查工具。

Go软件包发现站点pkg.go.dev也将在Go模块的支持下获得版本感知功能。我们一直在努力实现正确的核心功能与用户体验,目前的重新设计工作也正是为此而生。明年,我们会将godoc.org统一进pkg.go.dev当中。我们还将扩展各软件包的版本时间表,列出各个版本的重要变更及已知漏洞等,希望能够以总体目标为基础帮助大家更明智地选择适合添加的依赖项。

我们高兴地看到从GOPATH到GO模块的迁移之旅即将完成,而Go模块也开始推出一系列强大的依赖项感知工具。

泛型

广受Go用户们期待的新功能,自然非泛型莫属。如上所述,我们于今年6月发布了关于泛型的最新设计草案。在此之后,我们一直在完善相关工作,并将注意力转移到生产就绪版本的实现身上。我们将在2021年年内继续努力,力争在年底之前为大家带来一些可供试用的成果,也许会以Go 1.18 beta的形式发布。

Go生态系统的贡献者绝不止于谷歌内部的Go团队。我们要感谢与我们一起使用Go与工具的贡献者们。除此之外,Go能够获得成功,也离不开每一位朋友在生态系统中做出的大力支持。2020年是艰难的一年,感谢大家抽出宝贵时间加入我们这个大家庭,并帮助Go取得成功。

原文链接:

https://blog.golang.org/11years

延伸阅读:

Go语言之父:四十年来软件开发之巨变与Go的过去和未来-InfoQ

22个必知编程语言之「Go」-InfoQ

为什么 Go 语言没有泛型-InfoQ

关注我并转发此篇文章,私信我“领取资料”,即可免费获得InfoQ价值4999元迷你书,点击文末「了解更多」,即可移步InfoQ官网,获取最新资讯~