利用 GoLand 语法更新将代码库升级至 Go 1.26
处理现有的 Go 项目时,人们很少一开始就打算对其进行现代化改造。更多时候,你打开一个文件只是为了做一点小修改、添加一个字段或调整某些逻辑。代码能编译,测试能通过,一切看似正常,但语言本身在不断演进,而你的代码却停滞不前。
随着你升级项目的 Go 版本,可能会开始注意到旧代码中遗留多年的某些代码模式。这里多了一个辅助变量,那里有一个脆弱的错误检查。你可以手动修复,但随着修改工作分散到各个文件中,你很快就会失去上下文。
在 GoLand 中,针对 Go 1.26 的语法更新现在会以带有快速修复功能的针对性检查形式呈现。你可以在当前工作的位置直接看到这些更改建议,并在准备就绪时将其应用到整个项目中。
应用语法更新
一旦将项目的语言版本切换到 1.26,GoLand 就会将其视为一个信号:它现在可以开始查找那些更适合 Go 1.26 的代码模式。
[LOADING...]
首先你会注意到一个细微的变化。在可以安全现代化的代码下方会出现一条蓝色下划线。该下划线使用名为“语法更新”的专用严重性级别,并配有语言更新图标([LOADING...])。这并不是错误,而是提示代码可以在不改变其行为的前提下进行更新。
GoLand 新增了两项针对 Go 1.26 的语法更新检查:
- 使用
new()创建指针 - 使用
errors.AsType进行类型安全的错误解包
我们从最新的 Go 1.26 变更入手,并计划为近年来重要的语言和标准库更新添加更多检查规则。
使用 errors.AsType 进行类型安全的错误解包
Go 1.26 新增了 errors.AsType,它可以返回类型化的结果。这避免了 errors.As 所需的指针设置,并防止类型不匹配引发的 panic。GoLand 会建议使用这种更安全的形式,并提供“使用 errors.AsType 替换”的快速修复。你可以在 GoLand 或 官方 文档中阅读有关 errors.AsType 的更多信息。
之前 [LOADING...]
之后 [LOADING...]
使用 new() 创建指针
Go 1.26 允许 new() 接受表达式。这消除了那些仅仅为了获取其地址而存在的临时变量。GoLand 会高亮显示这种模式,并提供“使用 new() 替换”的快速修复。你可以在 GoLand 或 官方 文档中阅读有关 new() 的更多信息。
之前 [LOADING...]
之后 [LOADING...]
从单个修复扩展到整个项目
一旦应用了第一个快速修复,你就可以从单个修改转变为项目范围的更新。根据你的工作习惯,GoLand 提供了多种入口方式:
- 快速修复之后: 只需点击“分析其他语法更新的代码”。
[LOADING...]
- 通过 Search Everywhere(随处搜索): 打开 Search Everywhere(按两次 Shift 键)并选择 Update Syntax(更新语法)操作。
[LOADING...]
- 从
go.mod: 打开包含go 1.26指令的模块文件,然后点击 Analyze code for syntax updates(分析语法更新的代码)。
[LOADING...]
- 通过 Refactor(重构)菜单: 点击 Refactor 并选择 Update Syntax(更新语法)。
[LOADING...]
GoLand 会将结果收集在 Problems(问题)工具窗口中 Syntax updates(语法更新)节点下的单独标签页中。你可以逐一查看更新,或者批量应用它们。
GoLand 会为每个建议的更新显示修改前后的差异对比,以便你在应用之前审查具体的重写内容。
[LOADING...]
这种语法更新方法在实践中改变了什么
迁移到新的 Go 版本很少是一次大规模的重写。它通常发生在日常工作中穿插进行的数十次小型、安全的现代化改进过程中。
GoLand 通过以下几个相互关联的步骤来支持这一工作流程:
- 它帮助你尽早发现更新候选项。 当你编辑可以进行现代化的代码时,GoLand 会在编辑器中将其高亮显示。
- 它提供安全的重写。 你可以应用快速修复,将代码重写为 Go 1.26 的形式,而不会改变其行为。
- 它扩展到整个项目。 当你准备就绪后,可以在更大的范围内运行 Analyze code for other syntax updates(分析其他语法更新的代码),并在应用之前审查建议的更新。
- 它允许你批量应用更新。 在 Problems(问题)工具窗口的结果列表中,你可以逐一应用修复,或者应用分组修复来一次性更新多处代码。
这种组合让你能够推动代码库向前发展,而无需将迁移变成一个单独的项目。你更新一行代码,看到更好的形式,应用它,然后继续工作。
编码愉快!
GoLand 团队