Python 很容易。Go 很简单。简单 != 容易
Go 和 Python 的支持者围绕“简单”还是“容易”的语言更能带来长期更好的软件展开争论。Go 因风格统一、编译快、静态二进制以及适合大型多团队项目而受到称赞,但也因冗长、手工错误处理、抽象能力弱和与空值相关的坑而被批评。Python 则因生态丰富、上手快和语法表达力强而备受喜爱,但许多人指出其依赖管理脆弱、性能受限,并且随着流行度和功能集增长,复杂性也在上升。
Go 的样板代码、错误处理和冗长性
- 许多人觉得 Go 的样板代码(尤其是
if err != nil)很繁琐、视觉上很吵;也有人认为它明确、可预测,而且容易快速浏览。 - 错误处理一直存在争议:支持者更喜欢显式返回而不是异常;批评者指出 Go 并不强制检查错误,可能会在带着坏数据的情况下悄悄继续执行。
- 建议使用
go vet、lint 工具和 ErrCheck 来捕获未检查的错误,但怀疑者认为依赖工具加上样板代码并不稳妥。 defer很受欢迎,但其函数作用域行为让“在循环里 defer”之类的模式显得别扭;有些人希望它是块作用域的。
Go 的简单性 vs 表达力
- 支持者认为 Go 是“简单,而不是容易”:特性有限、编译快、向后兼容稳定,并且在不同代码库之间风格统一。
- 批评者说这种简单性过头了:缺少代数数据类型、健壮的枚举、不可空类型、优雅的错误传播,以及更丰富的标准库,导致模式冗长且容易出错(会出现多个自定义的
min、filter等)。 - 泛型和最近加入标准库的内容(例如
slices、maps、min/max)改善了情况,但来得太晚。
Go 在大型项目和团队中的表现
- 支持者声称 Go 很适合大型、长期、多团队协作的代码库:代码“看起来都一样”,性能“足够好”,静态类型加上简单并发是优势。
- 反例则指出:大型 Go 代码库可能通过 interface 和很小的方法被深度抽象,变成类似 Java 的“洋葱层”。过度使用
interface{}和 unsafe 技巧会导致非局部性破坏。 - 有人表示,百万行级 Go 系统是噩梦;也有人说任何百万行级项目都很痛苦,不管语言是什么。
Python 的易用性与生态 vs 基础能力
- Python 因入门门槛低、语法简洁、库丰富(尤其是机器学习/数据领域)以及在脚本和中小型应用上的高生产力而受到称赞。
- 批评包括:打包和部署摩擦、不同版本之间的运行时不兼容、性能、动态类型/鸭子类型问题、monkey patching,以及“后加上去”的类型系统。
- 有人认为 mypy 和 virtualenv 等工具缓解了很多问题;也有人认为核心问题(可空性、缺少 sum types、速度)依然存在。
Simple vs easy,以及其他替代方案
- “Simple vs Easy”的二分法(来自 Rich Hickey)被反复提及:Go 追求简单;Python 追求容易;Clojure 和 FP 语言被认为在更深层意义上更“简单”,但学习曲线更陡、生态更弱。
- 多数结论认为,语言选择应优先考虑运行时、工具链和生态,而不是语言设计的纯粹性。