Go 博客

Go 语言的十一年

Russ Cox,代表 Go 团队
2020 年 11 月 10 日

今天,我们庆祝 Go 开源版本发布十一周年。为 Go 问世十周年举办的派对似乎已是遥远的记忆。这是艰难的一年,但我们一直在推动 Go 开发向前发展,并积累了不少亮点。

在 11 月,Go 问世十周年后不久,我们启动了 go.dev 和 pkg.go.dev

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

在 3 月初,我们发布了 protocol buffers 的新 APIgoogle.golang.org/protobuf,极大地改进了对 protocol buffer 反射和自定义消息的支持。

当疫情爆发时,我们决定暂停春季的所有公开公告或发布,认识到大家的注意力理应放在其他地方。但我们没有停下工作,我们团队的一名成员加入了 Apple/Google 关于隐私保护接触通知的合作,以支持全球的接触者追踪工作。5 月,该团队发布了用 Go 编写的参考后端服务器

我们持续改进 gopls,它使许多编辑器能够实现高级的Go 感知支持。6 月,VSCode Go 扩展正式加入 Go 项目,现由开发 gopls 的同一批开发者维护。

同样在 6 月,感谢您的反馈,我们将 pkg.go.dev 背后的代码作为 Go 项目的一部分开源了。

6 月晚些时候,我们发布了泛型的最新设计草案,以及一个原型工具和泛型演练场

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

在 8 月,Go 1.15 版本主要带来了优化和错误修复,而非新功能。最重要的是开始重写链接器,平均使大型构建速度提升 20%,内存使用减少 30%。

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

Go 社区和其他所有人一样适应了“虚拟优先”的模式,今年我们看到了许多虚拟交流会和十多个虚拟 Go 会议。上周,Go 团队在 Google Open Source Live 举办了 Go 日活动(链接中包含视频)。

展望未来

我们也对 Go 语言的第 12 年充满了期待。最直接的是,本周 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 命令中支持 Fuzzing

Go Modules

在接下来的一年里,我们将继续致力于开发对 Go modules 的支持,并将其很好地整合到整个 Go 生态系统中。Go 1.16 将带来我们迄今为止最流畅的 Go modules 体验。我们近期调查的一个初步结果是,96% 的用户现在已经采用了 Go modules(一年前这一比例为 90%)。

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

从一开始,Go modules 的目标就是“将包版本的概念添加到 Go 开发者和我们工具的工作词汇中”,以便在整个 Go 生态系统中实现对 modules 和版本的深度支持。Go module mirror、checksum database 和 index 正是基于整个生态系统对包版本是什么的理解而得以实现。在接下来的一年里,我们将看到更多工具和系统增加丰富的 module 支持。例如,我们计划研究新的工具,帮助 module 作者发布新版本(go release),并帮助 module 用户更新其代码,从废弃的 API 迁移(新的 go fix)。

举一个更大的例子,我们创建了 gopls,将编辑器用于 Go 支持的许多工具(这些工具都不支持 modules)精简为一个支持 modules 的工具。在接下来的一年里,我们将准备好让 VSCode Go 扩展默认使用 gopls,提供出色的开箱即用的 module 体验,并且我们将发布 gopls 1.0。当然,gopls 的一大优点是它与编辑器无关:任何理解语言服务器协议的编辑器都可以使用它。

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

Go 包发现网站 pkg.go.dev 是另一个由 Go modules 支持的版本感知系统的例子。我们一直专注于完善核心功能和用户体验,包括今天推出的重新设计。在接下来的一年里,我们将把 godoc.org 整合到 pkg.go.dev 中。我们还将扩展每个包的版本时间线,显示每个版本中的重要更改、已知漏洞等,其总体目标是展示您所需的信息,以便就添加依赖项做出明智的决定

我们很高兴看到从 GOPATH 到 Go modules 的过渡即将完成,以及 Go modules 所促成的所有出色的依赖感知工具。

泛型

大家最关心的下一个特性当然是泛型。正如我们上面提到的,我们在 6 月份发布了泛型的最新设计草案。从那时起,我们一直在完善细节,并将注意力转向实现生产就绪版本的具体工作。我们将在 2021 年全年致力于此,目标是在年底前推出供大家试用的版本,可能是 Go 1.18 Beta 版的一部分。

感谢您!

Go 远不止是我们在 Google 的 Go 团队。我们非常感谢与我们一起开发 Go 版本和工具的贡献者。除此之外,Go 的成功离不开所有在 Go 生态系统中工作和贡献的你们。对于 Go 之外的世界来说,这是艰难的一年。我们比以往任何时候都更感谢您抽出时间加入我们,帮助 Go 取得如此巨大的成功。谢谢您。我们希望大家都能平安健康,并祝愿一切顺利。

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