vlambda博客
学习文章列表

Go语言11周年,泛型问题有望明年得到解决

作者 | 田晓旭、万佳
近日,Go 团队发布长篇博文庆祝 Go 语言开源 11 周年。

Go 团队在博文写道,“回想 Go 语言十周年庆典恍如隔世。虽然 2020 年有诸多艰难,但我们一直在推动 Go 语言的发展,其中有不少值得回忆的美好瞬间。”

1 Go 语言 2020 年的重大进展

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

3 月——推出了新的协议缓冲区 API,它大大提高了对协议缓冲区反射及自定义消息的支持能力。

5 月——开发团队启动了用 Go 编写的参考后端服务器。

博文写道,“我们继续改进 gopls,借此在多种编辑器中实现了对高级 Go 感知功能的支持。”

6 月——VSCode Go 扩展正式加入 Go 项目,目前由负责 gopls 的同一位开发者进行维护。同样在这个月,Go 团队对 pkg.go.dev 代码进行开源,并将其作为 Go 项目的组成部分。6 月下旬,团队发布了关于泛型的最新设计草案。

7 月——Go 团队发布并讨论了三套新的设计草案以供后续修改:new //go:build lines for file selection、 file system interfaces 和 build-time file embedding。

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

2 2021 年 Go 语言发布计划

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

2021.8——Go 1.17 将带来更多功能与改进,但目前还无法确定太多细节。根据计划,1.17 版本将提供一项针对 x86-64、基于寄存器的新型调用约定(不影响现有指令集!),使得程序的整个运行流程变得更快。(其他架构将在未来的版本中发布。)

此外该版本还将包含新的 //go:build 行,出错几率比现有 //+build 行更低。最后,Go 团队还希望能在明年对另一项备受期待的功能完成 Beta 测试,即支持 gotest 命令中的模糊测试。

3 Go 模块

明年,Go 团队将继续致力于开发对 Go 模块的支持,并更好地将其集成到整个 Go 生态系统中。Go 1.16 将包含迄今为止最为流畅的 Go 模块体验。据悉,当前有 96% 的用户已经使用 Go 模块。

Go 团队还将终止对基于 GOPATH 开发工作的支持。未来,使用标准库以外任何其他依赖项的程序,都需要配合 go.mod。

最初,Go 模块的目标就是“将软件包版本的概念融入 Go 开发者与我们工具的日常场景当中”,借此为整个 Go 生态系统中的模块及版本提供深度支持。事实上,Go 模块的镜像、校验数据库以及索引在实现过程中也充分考虑到整个生态系统范围内的软件包版本。明年,Go 团队将在工具与系统中推出更多丰富的模块支持选项。

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

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

Go 软件包发现站点 pkg.go.dev 也将在 Go 模块的支持下获得版本感知功能。

此外,Go 团队明年还会将 godoc.org 统一进 pkg.go.dev 当中。并且,还将扩展各软件包的版本时间表,列出各个版本的重要变更及已知漏洞等,希望能够以总体目标为基础帮助大家更明智地选择适合添加的依赖项。

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

4 泛型

根据 Go 语言社区发布的 2019 年度调查报告表明,79% 的受访者认为泛型是 Go 缺失的关键特性。缺少泛型和模块 / 包管理器使用是受访者面临的最大挑战。而这一问题有望在 2021 年得到缓解。

在今年 6 月,Go 团队发布了关于泛型的最新设计草案,此后一直在完善相关工作,并将注意力转移到生产就绪版本的实现身上。

Go 团队称,“我们将在 2021 年年内继续努力,力争在年底前为大家带来一些可供试用的成果,也许会以 Go 1.18 beta 的形式发布。”

5 ”加速奔跑“的 Go 语言

Go 语言的创始人之一 Rob Pike 在 2017 年的一篇文章《Go: Ten years and climbing》中,他回顾了 Go 语言的发展历程。文章提到,Go 语言这十年的迅猛发展竟如此之快,让他们自己都没想到。

更重要的是,Go 语言成为了云计算领域新一代的开发语言。并且,随着云原生的兴起和发展,Go 语言几乎占据了绝对的主流地位。无论是 Docker、Kubernetes,还是 Istio 和 Prometheus 等,都是用 Go 语言开发的。

Go 语言也受到海内外互联网大公司的热捧,像 Youtube、Uber 等使用 Go 作为自己的主力开发语言进行业务的迭代。在国内,今日头条、阿里巴巴、美团、B 站等知名公司,都在大量使用 Go 语言来重构部分甚至全部业务。而在游戏后端领域也有大量的公司在使用 Go 语言进行研发。

左耳朵耗子在《左耳听风》中谈了谈对 Go 语言的体会:

第一,语言简单,上手快。Go 语言的语法特性简直是太简单了,简单到你几乎玩不出什么花招,直来直去的,学习难度很低,容易上手。

第二,并行和异步编程几乎无痛点。Go 语言的 Goroutine 和 Channel 这两个神器简直就是并发和异步编程的巨大福音。像 C、C++、Java、Python 和 JavaScript 这些语言的并发和异步的编程方式控制起来就比较复杂了,并且容易出错,但 Go 语言却用非常优雅和流畅的方式解决了这个问题。这对于编程多年受尽并发和异步折磨的我来说,完全就是眼前一亮的感觉。

第三,Go 语言的 lib 库“麻雀虽小,五脏俱全”。Go 语言的 lib 库中基本上有绝大多数常用的库,虽然有些库还不是很好,但我觉得这都不是主要问题,因为随着技术的发展和成熟,这些问题肯定也都会随之解决。

第四,C 语言的理念和 Python 的姿态。C 语言的理念是信任程序员,保持语言的小巧,不屏蔽底层且对底层友好,关注语言的执行效率和性能。而 Python 的姿态是用尽量少的代码完成尽量多的事。于是我能够感觉到,Go 语言是想要把 C 和 Python 统一起来,这是多棒的一件事。



当然,Go 语言也存在诸多的问题,比如垃圾回收、异常处理、泛型编程等。

不过,我们相信 Go 团队和社区未来也会逐步解决这些问题。

今日文章推荐:




点个在看少个 bug 👇