Go 1 和 Go 程序的未来

介绍

Go 版本 1 的发布,简称 Go 1,是该语言开发过程中的一个重要里程碑。Go 1 是 Go 语言编写的程序和项目发展的一个稳定平台。

Go 1 定义了两件事:首先是语言规范;其次是核心 API 的规范,即 Go 库的“标准包”。Go 1 版本包括两种编译器套件(gc 和 gccgo)的实现形式,以及核心库本身。

其目的是,根据 Go 1 规范编写的程序将继续在该规范的整个生命周期内以不变的方式编译并正确运行。在某个不确定的时间点,Go 2 规范可能会出现,但在那之前,今天工作的 Go 程序应该继续工作,即使 Go 1 的未来“点”版本出现(Go 1.1、Go 1.2 等)。

兼容性是在源代码级别。编译包的二进制兼容性在版本之间不受保证。在点版本发布之后,Go 源代码需要重新编译才能与新版本链接。

API 可能会增长,获得新的包和功能,但不会以破坏现有 Go 1 代码的方式。

期望

虽然我们预计绝大多数程序会随着时间的推移保持这种兼容性,但无法保证将来不会出现任何会破坏任何程序的更改。本文档试图设定未来 Go 1 软件兼容性的期望。有一些方法可以让今天编译并运行的程序在未来的点版本发布后无法做到这一点。它们都不太可能发生,但值得记录。

当然,对于所有这些可能性,如果它们出现,我们会尽力在不影响现有代码的情况下更新规范、编译器或库。

这些相同的考虑因素适用于连续的点版本。例如,在 Go 1.2 下运行的代码应该与 Go 1.2.1、Go 1.3、Go 1.4 等兼容,但可能与 Go 1.1 不兼容,因为它可能使用仅在 Go 1.2 中添加的功能。

在版本之间添加的功能(在源代码库中可用,但不是编号的二进制版本的一部分)正在积极开发中。在这些功能发布之前,不会对使用这些功能的软件做出任何兼容性承诺。

最后,虽然这不是正确性问题,但程序的性能可能会受到其依赖的编译器或库实现更改的影响。无法保证版本之间给定程序的性能。

虽然这些期望适用于 Go 1 本身,但我们希望类似的考虑因素也适用于基于 Go 1 开发的外部软件。

子存储库

主 go 树的子存储库中的代码,例如 golang.org/x/net,可能是在更宽松的兼容性要求下开发的。但是,子存储库将被适当地标记以识别与 Go 1 点版本兼容的版本。

操作系统

无法保证与操作系统接口的长期兼容性,这些接口由外部各方更改。因此,syscall 包不在此处做出的保证范围内。从 Go 版本 1.4 开始,syscall 包已冻结。系统调用接口的任何演变都必须在其他地方得到支持,例如在 go.sys 子存储库中。有关详细信息和背景信息,请参阅 本文档

工具

最后,Go 工具链(编译器、链接器、构建工具等)正在积极开发中,其行为可能会发生变化。这意味着,例如,依赖于工具位置和属性的脚本可能会因点版本发布而出现故障。

除了这些注意事项之外,我们相信 Go 1 将成为 Go 及其生态系统发展坚实的基础。