Go 1.27

Go 1.27 引入了多项期待已久的语言和库改进,包括泛型方法、标准 `uuid` 包、SIMD 内建、改进后的 JSON 实现以及更好的浮点格式化,许多人将其视为显著的可用性和性能提升。评论者欢迎 Go 类型系统和工具链的演进,但仍在争论其“简洁”理念与增加复杂度之间的平衡,并提到代数数据类型和更易用的错误处理等缺失特性。生态兼容性也受到关注——从 linter 和 IDE 支持到数据库和加密集成——同时,人们也一如既往地抱怨 Go 在语法高亮和向后兼容等方面的保守选择。

语言和类型系统变更

  • 泛型方法广受好评;它们减少了样板代码(例如,不再需要按整数类型分别写方法),并解锁了更简洁的泛型处理器和库。
  • 现在可以在不显式提供类型参数的情况下调用泛型函数,修复了此前的可用性痛点。
  • 结构体字面量现在可以直接初始化嵌套/嵌入字段。许多人认为这是一次可用性提升,尤其对生成代码和测试很有帮助,不过也有人担心当嵌入字段同名时会引入微妙 bug;建议加入 vet/linter 检查。

标准库和核心运行时

  • 新的标准 uuid 包正被迅速采用,取代流行的第三方库;有些人预计会出现大量“顺手”PR。
  • 担忧点:标准的 uuid.UUID 不实现数据库扫描接口,但有评论者指出 database/sql 已获得原生支持,所以它“就是能用”。
  • JSON 改进和新的 SIMD 基元被视为解析和媒体工作负载方面的重大胜利。
  • 浮点数解析/格式化现在使用 uscale 算法,提升了简洁性和性能;一些人惊讶它没有在官方说明里被重点提及。
  • 后量子密码工作(例如 mldsa)受到欢迎;关于迁移有多紧迫以及混合方案的讨论也在持续。

性能和 SIMD

  • SIMD 内建函数被认为被低估了:易于使用,几乎没有 GC/边界开销,并且可以接近 Rust/C++ 的性能。
  • 有人分享了 Rust → Go 的 SIMD 移植案例,吞吐量相近,并声称这能减少仅仅为了速度而“重写成 Rust”的压力。

工具链和生态

  • 用于升级代码的 go fix 辅助工具受到欢迎。
  • golangci-lint 和 CI 中泛型方法支持的体验褒贬不一;如果更新了 gopls,它是可用的。
  • 有人称赞 Go 在编辑器中的导入和工具体验。

理念、可用性与争议

  • 持续存在的张力:Go 最初“简单、没有泛型”的立场,与如今逐步加入泛型和更高级类型之间的冲突。有人认为 Go 正在向 Java/C# 靠拢;也有人指出泛型一直都在考虑之中,而且它们仍然相对简单。
  • 许多人希望有代数数据类型、联合类型、模式匹配和更好的枚举;讨论了替代方案和提案,但如果没有语言级的穷尽匹配,它们就被认为不完整。
  • 错误处理仍然存在分歧:有些人讨厌它的冗长,另一些人则认为“错误即值”相比异常极大提升了可靠性。
  • 关于 Go 官方页面缺少语法高亮的争论:有些人认为颜色对可读性至关重要;另一些人则认为它没必要,甚至会分散注意力。