Go 博客
Go 的十一年
今天我们庆祝 Go 开源发布十一周年。我们为Go 十岁生日举办的派对似乎还近在眼前。今年是充满挑战的一年,但我们一直在推动 Go 的开发向前发展,并取得了不少重要的进展。
在十一月,我们 Go 的十岁生日过后不久,就推出了go.dev 和 pkg.go.dev。
二月,Go 1.14 发布带来了第一个正式的“生产可用”的 Go Modules 实现,以及许多性能改进,包括更快的 defer 和非协作式 goroutine 抢占,以降低调度和垃圾回收的延迟。
三月初,我们推出了Protobuf 的新 API,即google.golang.org/protobuf,它极大地改进了 Protobuf 反射和自定义消息的支持。

当疫情爆发时,我们决定暂停春季的任何公开公告或发布,认识到大家的注意力理应放在其他地方。但我们一直在工作,我们的团队成员加入了 Apple/Google 关于隐私保护的暴露通知的合作,以支持全球的接触者追踪工作。五月,该团队推出了用 Go 编写的参考后端服务器。
我们继续改进gopls,它为许多编辑器提供了先进的Go 感知支持。六月,VSCode Go 扩展正式加入 Go 项目,现在由与 gopls 相同的开发人员维护。
同样在六月,感谢您的反馈,我们将pkg.go.dev 的后端代码作为 Go 项目的一部分开源了。
六月晚些时候,我们发布了泛型的最新设计草案,以及一个原型工具和泛型游乐场。
七月,我们发布并讨论了三个关于未来更改的新设计草案:用于文件选择的新的 //go:build
行、文件系统接口和构建时文件嵌入。(正如下面所指出的,我们将在 2021 年看到所有这些。)
八月,Go 1.15 发布主要提供了优化和错误修复,而不是新功能。其中最显著的是链接器重写的开始,使其运行速度提高了 20%,在大型构建中平均内存使用量减少了 30%。
上个月,我们进行了年度Go 用户调查。在分析结果后,我们将在博客上发布。
Go 社区像其他人一样适应了“虚拟优先”模式,今年我们看到了许多虚拟的聚会和十几个虚拟的 Go 会议。上周,Go 团队在Google 开源直播的 Go 日(链接处有视频)上主持了活动。
展望未来
我们也对 Go 第十二年的发展充满期待。最直接的是,本周 Go 团队成员将在GopherCon 2020 上进行八场演讲。请记下您的日历!
- Robert Griesemer 的演讲“Typing [Generic] Go”,
11 月 11 日,美国东部时间上午 10:00;上午 10:30 进行问答。 - “What to Expect When You’re NOT Expecting”,Go Time 播客的现场录制,特邀专家调试员包括 Hana Kim,
11 月 11 日中午 12:00. - Michael Knyszek 的演讲“Evolving the Go Memory Manager’s RAM and CPU Efficiency”,
11 月 11 日下午 1:00;下午 1:50 进行问答。 - Dan Scales 的演讲“Implementing Faster Defers”,
11 月 11 日下午 5:10;下午 5:40 进行问答。 - “Go Team - Ask Me Anything”,与 Julie Qiu、Rebecca Stambler、Russ Cox、Sameer Ajmani 和 Van Riper 的现场问答,
11 月 12 日下午 3:00. - Austin Clements 的演讲“Pardon the Interruption: Loop Preemption in Go 1.14”,
11 月 12 日下午 4:45;下午 5:15 进行问答。 - Jonathan Amsterdam 的演讲“Working with Errors”,
11 月 13 日下午 1:00;下午 1:50 进行问答。 - Carmen Andoh 的演讲“Crossing the Chasm for Go: Two Million Users and Growing”,
11 月 13 日下午 5:55.
Go 版本发布
二月,Go 1.16 版本将包含新的文件系统接口和构建时文件嵌入。它将完成链接器的重写,带来额外的性能改进。并将支持新的 Apple Silicon (GOARCH=arm64
) Mac。
八月,Go 1.17 版本无疑会带来更多功能和改进,尽管距离现在还有一段距离,具体细节仍未确定。它将包含一个针对 x86-64 的新的基于寄存器的调用约定(不会破坏现有汇编!),这将使程序的整体速度更快。(其他架构将在后续版本中跟进。)一个肯定会被包含的不错的功能是新的//go:build
行,它比当前的 //
+build
行更不容易出错。另一个备受期待的功能是希望明年能准备好进行 beta 测试的 go test
命令中的模糊测试支持。
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 Modules 镜像、校验数据库和索引才得以实现。在接下来的一年里,我们将看到更多工具和系统添加丰富的 Modules 支持。例如,我们计划研究新的工具来帮助 Modules 作者发布新版本(go release
),以及帮助 Modules 消费者更新他们的代码以迁移掉已弃用的 API(一个新的 go fix
)。
作为一个更大的例子,我们创建了 gopls 来减少编辑器使用的许多 Go 支持工具,而这些工具都不支持 Modules,最终统一为一个支持 Modules 的工具。在接下来的一年里,我们将准备好让 VSCode Go 扩展默认使用 gopls
,从而开箱即用地获得出色的 Modules 体验,并将发布 gopls 1.0。当然,gopls 最好的地方之一是它不依赖于编辑器:任何理解语言服务器协议的编辑器都可以使用它。
版本信息的另一个重要用途是跟踪构建中的任何包是否存在已知漏洞。在接下来的一年里,我们计划开发一个已知漏洞数据库以及用于根据该数据库检查程序的工具。
Go 包发现网站pkg.go.dev是 Go Modules 促成的另一个版本感知系统的例子。我们一直专注于正确地实现核心功能和用户体验,包括今天推出的重新设计的版本。在接下来的一年里,我们将把 godoc.org 合并到 pkg.go.dev 中。我们还将扩展每个包的版本时间线,显示每个版本中的重要更改、已知漏洞等,遵循总体目标,即提供您做出关于添加依赖项的明智决策所需的信息。
我们很高兴看到从 GOPATH 到 Go Modules 的这一历程即将完成,以及 Go Modules 所支持的所有优秀的依赖感知工具。
泛型
每个人都在关注的下一个功能无疑是泛型。正如我们上面提到的,我们在六月发布了泛型的最新设计草案。自那时以来,我们一直在不断完善细节,并将注意力转向实现生产就绪版本的细节。我们将在整个 2021 年致力于此,目标是在年底前提供一些可以供大家试用的东西,也许是 Go 1.18 beta 版本的一部分。
感谢!
Go 的意义远不止我们 Google 的 Go 团队。我们非常感谢与我们一起进行 Go 版本发布和工具开发的贡献者。除此之外,Go 的成功离不开所有在 Go 蓬勃发展的生态系统中工作并做出贡献的你们。今年的世界充满了挑战。我们比以往任何时候都更感激您抽出宝贵时间与我们一起,帮助 Go 取得如此巨大的成功。谢谢您。希望您一切安好,并祝您一切顺利。
下一篇文章:将 godoc.org 请求重定向到 pkg.go.dev
上一篇文章:Pkg.go.dev 全新改版!
博客索引