Go 考古:错误处理的“语法糖”之战与最终的“投降”
💡
原文中文,约6000字,阅读约需15分钟。
📝
内容提要
Go 语言的错误处理哲学以“if err != nil”为核心,尽管被认为繁琐,但设计者坚持使用返回码而非异常机制。文章回顾了这一选择的历史,分析了返回码和异常的优缺点,最终认为现有方式虽然繁琐,但有效且清晰,未来不再寻求语法变更。
🎯
关键要点
- Go 语言的错误处理哲学以 'if err != nil' 为核心,设计者坚持使用返回码而非异常机制。
- Go 团队拒绝为错误处理提供语法糖的原因与历史背景有关,源于对异常与返回码的辩论。
- 返回码的五宗罪包括代码混淆、侵占返回通道、贫乏的错误信息、无法在构造函数中使用和容易被忽略。
- 异常机制的原罪包括隐形的 goto 和过多的出口,增加了代码推理的难度。
- Go 选择返回码是因为其显式的代码复杂性可控,而异常带来的隐式复杂性难以推理。
- Go 通过多返回值、error 接口、工厂模式和静态分析工具等设计反驳了返回码的缺陷。
- Go 的设计者认为错误是值,鼓励开发者利用现有能力优雅地处理错误。
- 尽管有对语法糖的需求,Go 团队在2025年决定停止寻求语法上的语言变更,认为现有方式有效且清晰。
- Go 社区对错误处理的理解加深,现有的错误处理方式在很多情况下是可以接受的。
- 这场围绕错误处理的语法糖之战没有赢家,但加深了对清晰性与简单性的理解。
➡️