Go的简洁神话?转Go前你需要知道的5个“真相”
本文永久链接 – https://tonybai.com/2025/04/29/hard-truths-before-switching-to-go
大家好,我是Tony Bai。
Go 语言近年来势头强劲,凭借其简洁、高效、出色的并发能力和工具链,吸引了大量开发者投身其中。甚至连TypeScript 团队也宣布将其编译器和工具集迁移到 Go,以提升性能。这无疑是对 Go 的巨大认可。
然而,正如一位拥有超过 15 年经验(主要使用 Java/Kotlin/TypeScript)、并在过去一年深度使用 Go 的开发者(以下简称“视频作者”)在其分享的油管视频中提到的那样,尽管 Go 非常出色,但光环之下并非没有阴影。在投入实际项目,特别是构建一些非同小可的东西之后,会发现 Go 的一些设计决策有利有弊,有些“简洁”的背后隐藏着需要注意的“真相”。
这位作者认为,计划学习或在下一个项目中使用 Go 的开发者,都应该了解这些潜在的“硬伤”或权衡。以下是他总结的、在转向 Go 之前你需要真正了解的五件事,主要转述自他的分享:
真相一:简洁的表象与表达力的代价
Go 最大的卖点之一是它的简洁性。表面上看,它确实如此。但视频作者认为,一旦你超越了教程的范畴,就会发现这种简洁很多时候是以牺牲表达力为代价的。
- 隐藏而非消除复杂性?
- 比如,Go 有 while 循环的功能,却没有 while 关键字,你需要用 for 循环省略条件来实现。
- 可见性(公有/私有)由首字母大小写决定,而非明确的 public/private 关键字。这虽然简洁,但在重构时容易忽略,更改大小写可能在没有编译器警告的情况下破坏 API。
- 枚举(Enum)也没有原生支持,而是通过 const 和 iota 的变通方法实现。
在作者看来,Go 似乎不惜一切代价追求简单和极简的外观,有时这意味着隐藏了复杂性,而不是真正消除了它。
真相二:多返回值并非“一等公民”
从函数返回多个值是 Go 的一个特色,尤其在错误处理上,(value, error) 模式初看很优雅,没有异常、没有 try-catch。
但视频作者指出的根本问题是:Go 中的多返回值实际上不是元组 (Tuples) 或一等公民 (First-class values)。
- 你不能将它们整体存入一个变量。
- 你不能将它们放入切片 (Slice)。
- 你不能通过通道 (Channel) 发送它们。
- 你无法用泛型 (Generics) 对它们进行抽象。
这意味着,当需要处理一系列返回 (value, error) 的结果时(例如并发执行多个操作后收集),你被迫创建一个自定义的结构体 (struct) 类型来将这些值打包在一起。作者认为,这种为了传递数据而创建额外类型的做法,正是他当年想要逃离 Java 时所厌恶的不必要的样板代码 (boilerplate code)。
真相三:错误处理极其冗长
Go 的错误处理方式,特别是 if err != nil { return …, err } 的模式,是开发者初次接触 Go 时最常见的抱怨点之一。
视频作者坦言,在 Go 中管理错误是极其冗长 (extremely verbose) 的。
- 虽然 Go 官方称之为“显式错误处理”,并由 Rob Pike 等创造者辩护其提高了可读性、保持了控制流清晰,但与其他语言(如 Rust)提供的解决方案相比,确实显得繁琐。
- 社区曾尝试改进,甚至有过添加内置 try 机制的提案,但最终因担心破坏 Go 的简洁性而被否决。
真相四:拥抱组合,但需适应思维转变
Go 的创造者们反对像 Java 那样复杂的继承体系,认为继承容易导致脆弱、混乱的代码库。因此,Go 的官方哲学是避免继承,倾向于组合 (composition)。
- Go 中的嵌入 (Embedding) 看起来有点像继承,但作者强调它完全是另一回事。
- 这种方法确实在很多方面让 Go 代码更简单、更可预测,但它意味着来自传统面向对象编程 (OOP) 语言的开发者需要调整他们的思维方式。
- Go 并非试图成为部分 OOP 语言,而是提供了一种不同的代码组织方法,用清晰性和简洁性换取了继承的部分灵活性。
真相五:泛型设计,简洁性优先于灵活性
Go 最初没有泛型,这个决定限制了语言十多年。泛型最终在 2022 年 (Go 1.18) 引入,但其设计仍然体现了 Go 简洁性优于灵活性的哲学。
- Go 不支持函数或运算符重载 (overloading)。
- 其类型约束系统虽然对许多用例足够强大,但并未提供其他语言中 traits 或 type classes 的全部表达能力。
这依然符合 Go 优先考虑清晰度和可读性,而非极致表达能力的基本理念。
结语:睁大眼睛看Go
视频作者最后总结,如果你期望 Go 能提供像具有大量语法糖的高级语言那样的开发体验,你会感到失望。
但如果你在寻找一门快速、可靠、务实、不碍事且编译飞快的语言,Go可能就是最适合你的工具。
关键在于,要“睁大眼睛去看待它 (go in with your eyes open)”。因为,仅仅通过看视频或教程喜欢上一门语言,和在维护一个有真实用户、边缘情况的真实世界项目后仍然喜欢它,这两者之间可能存在巨大的差别。理解 Go 的这些设计选择和它所带来的权衡,对于做出明智的技术决策至关重要。
希望转述的这些来自一线开发者的“硬核”观察,能帮助大家更全面地认识 Go。
你对 Go 的这些特性有什么实际体验或看法?欢迎在评论区留言讨论!
视频地址:https://www.youtube.com/watch?v=UEU4SzBjqrc
系统学习,夯实基础
想要更系统、更深入地理解 Go 语言,从基础语法、并发编程到设计哲学和工程实践,全面掌握这门高效的语言吗?欢迎订阅我在极客时间的专栏 《Go 语言第一课》。那里有更结构化的知识体系和详尽的讲解,助你打下坚实的 Go 语言基础,从容应对真实世界的挑战。
商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。
评论