本文永久链接 – 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 似乎不惜一切代价追求简单和极简的外观,有时这意味着隐藏了复杂性,而不是真正消除了它。
从函数返回多个值是 Go 的一个特色,尤其在错误处理上,(value, error) 模式初看很优雅,没有异常、没有 try-catch。
但视频作者指出的根本问题是:Go 中的多返回值实际上不是元组 (Tuples) 或一等公民 (First-class values)。
这意味着,当需要处理一系列返回 (value, error) 的结果时(例如并发执行多个操作后收集),你被迫创建一个自定义的结构体 (struct) 类型来将这些值打包在一起。作者认为,这种为了传递数据而创建额外类型的做法,正是他当年想要逃离 Java 时所厌恶的不必要的样板代码 (boilerplate code)。
Go 的错误处理方式,特别是 if err != nil { return …, err } 的模式,是开发者初次接触 Go 时最常见的抱怨点之一。
视频作者坦言,在 Go 中管理错误是极其冗长 (extremely verbose) 的。
Go 的创造者们反对像 Java 那样复杂的继承体系,认为继承容易导致脆弱、混乱的代码库。因此,Go 的官方哲学是避免继承,倾向于组合 (composition)。
Go 最初没有泛型,这个决定限制了语言十多年。泛型最终在 2022 年 (Go 1.18) 引入,但其设计仍然体现了 Go 简洁性优于灵活性的哲学。
这依然符合 Go 优先考虑清晰度和可读性,而非极致表达能力的基本理念。
视频作者最后总结,如果你期望 Go 能提供像具有大量语法糖的高级语言那样的开发体验,你会感到失望。
但如果你在寻找一门快速、可靠、务实、不碍事且编译飞快的语言,Go可能就是最适合你的工具。
关键在于,要“睁大眼睛去看待它 (go in with your eyes open)”。因为,仅仅通过看视频或教程喜欢上一门语言,和在维护一个有真实用户、边缘情况的真实世界项目后仍然喜欢它,这两者之间可能存在巨大的差别。理解 Go 的这些设计选择和它所带来的权衡,对于做出明智的技术决策至关重要。
希望转述的这些来自一线开发者的“硬核”观察,能帮助大家更全面地认识 Go。
你对 Go 的这些特性有什么实际体验或看法?欢迎在评论区留言讨论!
视频地址:https://www.youtube.com/watch?v=UEU4SzBjqrc
系统学习,夯实基础
想要更系统、更深入地理解 Go 语言,从基础语法、并发编程到设计哲学和工程实践,全面掌握这门高效的语言吗?欢迎订阅我在极客时间的专栏 《Go 语言第一课》。那里有更结构化的知识体系和详尽的讲解,助你打下坚实的 Go 语言基础,从容应对真实世界的挑战。
商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。
© 2025, bigwhite. 版权所有.