Go 1 及 Go 程序未来的发展
引言
Go 语言版本 1(简称 Go 1)的发布是 Go 语言发展史上的一个重要里程碑。Go 1 是一个稳定的平台,为 Go 编写的程序和项目的增长提供了基础。
Go 1 定义了两件事:首先是语言的规范;其次是一组核心 API(Go 标准库的“标准包”)的规范。Go 1 版本包含了它们的实现,形式为两个编译器套件(gc 和 gccgo)以及核心库本身。
我们期望按照 Go 1 规范编写的程序,在该规范的整个生命周期内,无需修改即可继续正确编译和运行。在某个不确定的时间点,可能会出现 Go 2 规范,但在那之前,即使将来 Go 1 出现“点”版本(Go 1.1、Go 1.2 等),现在能工作的 Go 程序应该继续工作。
兼容性体现在源代码层面。编译后的包在不同版本之间不保证二进制兼容性。发布点版本后,Go 源代码需要重新编译以链接新的版本。
API 可能会增长,增加新的包和功能,但不会以破坏现有 Go 1 代码的方式进行。
预期
尽管我们预期绝大多数程序会随时间保持这种兼容性,但无法保证未来没有任何更改会破坏任何程序。本文档旨在阐明未来 Go 1 软件的兼容性预期。现在能够编译和运行的程序,在未来的点版本发布后,有多种方式可能会失败。它们都不太可能发生,但值得记录。
- 安全性。规范或实现中可能会出现需要打破兼容性来解决的安全问题。我们保留解决此类安全问题的权利。
- 未指定行为。Go 规范试图明确语言的大多数属性,但有些方面是未定义的。依赖于此类未指定行为的程序在未来版本中可能会中断。
- 规范错误。如果需要解决规范中的不一致或不完整之处,解决该问题可能会影响现有程序的含义或合法性。我们保留解决此类问题的权利,包括更新实现。除非是安全问题,否则不会对规范进行不兼容的更改。
- Bug。如果编译器或库存在违反规范的 bug,依赖于该 bug 行为的程序在 bug 修复后可能会中断。我们保留修复此类 bug 的权利。
- 结构体字面量。为了在后续点版本中添加功能,可能需要在 API 中向导出的结构体添加字段。使用未带键的结构体字面量(如 pkg.T{3, "x"})创建这些类型值的代码在此类更改后将无法编译。但是,使用带键的字面量(pkg.T{A: 3, B: "x"})的代码在此类更改后将继续编译。我们将以一种允许带键的结构体字面量保持兼容性的方式更新此类数据结构,尽管未带键的字面量可能无法编译。(还有涉及嵌套数据结构或接口的更复杂情况,但它们的解决方案是相同的。)因此,我们建议类型在单独包中定义的复合字面量应使用带键的表示法。
- 方法。与结构体字段一样,可能需要在非接口类型中添加方法。在某些情况下,例如当类型与另一种类型一起嵌入到结构体中时,新方法的添加可能会通过与另一种嵌入类型的现有方法产生冲突而破坏结构体。我们无法预防这种罕见情况,也不保证发生这种情况时的兼容性。
- 点导入。如果程序使用
import . "path"
导入标准包,未来版本中导入包中定义的其他名称可能与程序中定义的其他名称冲突。我们不建议在测试之外使用import .
,使用它可能导致程序在未来版本中无法编译。 - 使用
unsafe
包。导入unsafe
的包可能依赖于 Go 实现的内部属性。我们保留更改实现以可能破坏此类程序的权利。
当然,对于所有这些可能性,如果它们发生,我们都会尽可能努力更新规范、编译器或库,而不影响现有代码。
这些相同的考虑因素适用于后续的点版本。例如,在 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 及其生态系统发展的坚实基础。