让Go 1.21 保持『无聊』,Google 工程师谈如何实现向后兼容性

2023年 9月 1日 96.9k 0

Google 工程师Russ Cox 最近详细介绍了 Google 所做的工作,如何确保每个新的 Go 版本都遵循 Go 的向后兼容性保证。

这里包括GODEBUG在 Go 1.21 中进行泛化,以涵盖甚至微妙的不兼容情况。

(原文地址:https://go.dev/blog/compat)

Go 语言的向后兼容性保证是在 Go 1 中引入的,它可以确保所有正确的 Go 程序继续与该语言的未来版本无修改即可使用。Cox 详细解释说,这个目标包含两项主要工作:检查每个 API 更改是否会破坏任何内容,第二进行广泛的测试捕获更微妙的不兼容情况。

虽然检查 API 更改以防止任何重大更改进入新版本的想法,可能听起来很明显,但 Cox 还描述了许多测试和可行性方法的详细情况:

发现意外不兼容性的有效方法是针对下一个 Go 版本的开发版运行现有测试。团队针对 Google 的所有内部 Go 代码滚动测试 Go 的开发版本。当测试通过时,我们将它提交为 Google 的生产安装版本 Go 工具链。

Cox 提供的示例分为几个不同的类别,包括更改time.Now()库函数的精度、输出或输入更改以及协议更改。不过在某些情况下,重大变化是由须纳入该语言重要新功能带来的,例如Go 1.6 中的 HTTP/2 支持、在 Go 1.18 中的 SHA1 功能和相关函数被弃用。

为了处理这种情况,Go 在 1.6 版本中提供了一个特定的功能,即GODEBUG环境变量,可用于禁用特定模块的 HTTP/2。Cox 表示,在 Go 1.21 中,该GODEBUG机制得到了扩展与正式化。

Go 1.21 不使用环境变量,而是使用go:debug,这包含在main包中. 这与模块文件中列出的 Go 版本结合使用go.mod是相同的,这样也方便每个指定的 Go 版本都将具有默认行为,从而确保逐个功能的兼容性,同时go:debug可用于覆盖它。例如,考虑到 Go 1.21 改变了panic(nil)行为,开发人员可能希望将其工具链升级到 Go 1.21,但仍可保留旧版本的行为。go:debug这可以通过使用以下命令覆盖特定于版本的设置:

//go:debug panicnil=1 

根据 Cox 的说法,以上机制使得 Go 的每个新版本都成为旧版本的最佳实现,即使面对重要的重大更改,也可以修复错误,同时也保持了向后兼容性。

本文为 @ 万能的大雄 创作并授权发布,未经许可,不得转载。

内容授权事宜请您联系 info@21cto.com或关注 21CTO 公众号。

该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。

相关文章

塑造我成为 CTO 之路的“秘诀”
“人工智能教母”的公司估值达 10 亿美金
教授吐槽:985 高校成高级蓝翔!研究生基本废了,只为房子、票子……
Windows 蓝屏中断提醒开发者:Rust 比 C/C++ 更好
Claude 3.5 Sonnet 在伽利略幻觉指数中名列前茅
上海新增 11 款已完成登记生成式 AI 服务

发布评论