Python 很容易。Go 很简单。简单 != 容易

Go 和 Python 的支持者围绕“简单”还是“容易”的语言更能带来长期更好的软件展开争论。Go 因风格统一、编译快、静态二进制以及适合大型多团队项目而受到称赞,但也因冗长、手工错误处理、抽象能力弱和与空值相关的坑而被批评。Python 则因生态丰富、上手快和语法表达力强而备受喜爱,但许多人指出其依赖管理脆弱、性能受限,并且随着流行度和功能集增长,复杂性也在上升。

Go 的样板代码、错误处理和冗长性

  • 许多人觉得 Go 的样板代码(尤其是 if err != nil)很繁琐、视觉上很吵;也有人认为它明确、可预测,而且容易快速浏览。
  • 错误处理一直存在争议:支持者更喜欢显式返回而不是异常;批评者指出 Go 并不强制检查错误,可能会在带着坏数据的情况下悄悄继续执行。
  • 建议使用 go vet、lint 工具和 ErrCheck 来捕获未检查的错误,但怀疑者认为依赖工具加上样板代码并不稳妥。
  • defer 很受欢迎,但其函数作用域行为让“在循环里 defer”之类的模式显得别扭;有些人希望它是块作用域的。

Go 的简单性 vs 表达力

  • 支持者认为 Go 是“简单,而不是容易”:特性有限、编译快、向后兼容稳定,并且在不同代码库之间风格统一。
  • 批评者说这种简单性过头了:缺少代数数据类型、健壮的枚举、不可空类型、优雅的错误传播,以及更丰富的标准库,导致模式冗长且容易出错(会出现多个自定义的 minfilter 等)。
  • 泛型和最近加入标准库的内容(例如 slicesmapsmin/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 语言被认为在更深层意义上更“简单”,但学习曲线更陡、生态更弱。
  • 多数结论认为,语言选择应优先考虑运行时、工具链和生态,而不是语言设计的纯粹性。