Go 博客

Go 十一年

Go 团队的 Russ Cox
2020 年 11 月 10 日

今天,我们庆祝 Go 开源发布十一年周年。我们为 Go 十周年举办的派对似乎已成为遥远的记忆。今年是艰难的一年,但我们一直在推动 Go 的发展,并取得了一些亮点。

11 月,在 Go 十周年纪念日后不久,我们推出了 go.dev 和 pkg.go.dev

2 月,Go 1.14 版本发布了 Go 模块的第一个正式“生产就绪”版本,以及许多性能改进,包括 更快的 defer非协作 goroutine 抢占 以减少调度和垃圾回收延迟。

3 月初,我们发布了一个 用于协议缓冲区的全新 APIgoogle.golang.org/protobuf,它对协议缓冲区反射和自定义消息提供了更好的支持。

疫情爆发后,我们决定在春季暂停任何公开公告或发布,因为我们认识到每个人的注意力都应该放在其他地方。但我们一直在努力,我们的一位团队成员加入了 Apple/Google 合作开发的 隐私保护暴露通知 项目,以支持全球的接触者追踪工作。5 月,该小组发布了 参考后端服务器,该服务器是用 Go 编写的。

我们继续改进 gopls,它支持许多编辑器中的高级 Go 感知支持。6 月,VSCode Go 扩展正式加入 Go 项目,现在由与 gopls 开发人员相同的开发人员维护。

同样在 6 月,感谢您的反馈,我们也开源了 pkg.go.dev 背后的代码

6 月下旬,我们 发布了泛型的最新设计草案,以及一个原型工具和 泛型游乐场

7 月,我们发布并讨论了未来更改的三个新的设计草案:用于文件选择的新的 //go:build文件系统接口构建时文件嵌入。(正如下面所述,我们将在 2021 年看到所有这些。)

8 月,Go 1.15 版本主要提供优化和错误修复,而不是新功能。最重要的是链接器的重写工作开始,这使得链接器在大型构建中平均运行速度提高了 20%,内存使用量减少了 30%。

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

Go 社区与其他所有人一样,适应了“虚拟优先”模式,今年我们看到了许多虚拟聚会和十多个虚拟 Go 会议。上周,Go 团队主办了 Google 开源直播中的 Go 日(链接中提供了视频)。

展望未来

我们也对 Go 第十二年即将发生的事情感到非常兴奋。最直接的是,本周 Go 团队成员将在 GopherCon 2020 上举办八场活动。请做好准备!

Go 版本

2 月,Go 1.16 版本将包含新的 文件系统接口构建时文件嵌入。它将完成链接器的重写,带来额外的性能改进。并且它将支持新的 Apple Silicon (GOARCH=arm64) Mac。

8 月,Go 1.17 版本无疑会带来更多功能和改进,尽管时间还早,具体细节仍不确定。它将包含针对 x86-64 的新的基于寄存器的调用约定(不会破坏现有的汇编!),这将使程序在整体上运行得更快。(其他架构将在以后的版本中提供支持。)一个肯定会包含的不错功能是 新的 //go:build,它们比 当前的 // +build 容易出错得多。我们非常期待的功能,希望明年能够进行 beta 测试,是 go test 命令中支持模糊测试

Go 模块

在未来一年中,我们将继续致力于开发对 Go 模块的支持,并将它们很好地集成到整个 Go 生态系统中。Go 1.16 将提供迄今为止最流畅的 Go 模块体验。我们最近调查得出的初步结果是,96% 的用户现在已经采用了 Go 模块(一年前为 90%)。

我们也将最终停止对基于 GOPATH 的开发的支持:任何使用标准库以外的依赖项的程序都需要一个 go.mod。(如果您尚未切换到模块,请参阅 GOPATH wiki 页面,了解从 GOPATH 到模块的此最终步骤的详细信息。)

从一开始,Go 模块的目标一直是“将包版本的概念添加到 Go 开发人员和我们的工具的工作词汇表中”,以便在整个 Go 生态系统中对模块和版本提供深入的支持。Go 模块镜像、校验和数据库和索引 正是由于生态系统范围内对包版本是什么的理解才得以实现。在未来一年中,我们将看到更多工具和系统中添加了丰富的模块支持。例如,我们计划研究新的工具来帮助模块作者发布新版本 (go release),以及帮助模块使用者更新他们的代码以迁移出弃用的 API(新的 go fix)。

举一个更大的例子,我们创建了 gopls,以减少编辑器用于 Go 支持的许多工具(这些工具都不支持模块)到一个支持模块的工具。在未来一年中,我们将准备使 VSCode Go 扩展默认使用 gopls,以便开箱即用地获得出色的模块体验,并且我们将发布 gopls 1.0。当然,gopls 最好的方面之一是它与编辑器无关:任何了解 语言服务器协议 的编辑器都可以使用它。

版本信息的另一个重要用途是跟踪构建中的任何包是否存在已知的漏洞。在未来一年中,我们计划开发一个已知漏洞数据库以及工具来检查您的程序是否与该数据库冲突。

Go 包发现站点 pkg.go.dev 是 Go 模块启用的另一个版本感知系统的示例。我们一直专注于使核心功能和用户体验正确,包括 今天推出的重新设计。在未来一年中,我们将把 godoc.org 统一到 pkg.go.dev 中。我们还将扩展每个包的版本时间线,显示每个版本的重要更改、已知的漏洞等等,遵循整体目标,即提供您需要的信息,以便 做出关于添加依赖项的明智决策

我们很高兴看到从 GOPATH 到 Go 模块的这一旅程即将完成,以及 Go 模块启用的所有出色的依赖项感知工具。

泛型

每个人都在关注的下一个功能当然是泛型。如上所述,我们早在 6 月就发布了 泛型的最新设计草案。从那时起,我们一直在继续完善粗糙的边缘,并将注意力转向实现生产就绪版本的细节。我们将在 2021 年持续进行这项工作,目标是在年底之前提供一些供人们尝试的东西,也许是 Go 1.18 beta 版的一部分。

感谢您!

Go 的成功远不止 Google Go 团队的努力。我们非常感谢与我们一起发布 Go 版本和工具的贡献者们。除此之外,Go 的成功也离不开所有在 Go 蓬勃发展的生态系统中工作和贡献的你们。世界外部经历了艰难的一年。我们比以往任何时候都更感谢您抽出时间加入我们,并帮助 Go 取得如此巨大的成功。谢谢。我们希望大家一切安好,并祝愿大家一切顺利。

下一篇文章:将 godoc.org 请求重定向到 pkg.go.dev
上一篇文章:Pkg.go.dev 焕然一新!
博客索引