对 Go 编程哲学的一点理解

sorcererxw /

由于最近因为项目原因,需要编写 Go 代码。由于本人一直以来都在使用 TypeScripts 和 Kotlin 这两个包含大量语法糖的语言,一上手 Go 非常不适应。一开始写 Go 就开始嫌弃 Go 的各种缺失,期待包含泛型的 Go2。但是随着使用的加深,逐渐理解 Go 里面各种设计的初衷。

  • 通过显式返回错误。

    强制开发者思考这个错误的原因和是否应当进行处理。

  • 严格区分指针类型和值类型。

    强制开发者思考选择哪种类型以及带来的风险。

  • 更好的源码阅读体验。

    原滋原味的面向对象语言(如 Java),有着严密的类型层级,往往查看源码实现需要一层一层查看代码每一层实现。根源其实是:继承是紧耦合的,而开发者又在大量使用继承。

    Go 几乎强制使用组合取代继承,尽可能保证代码的精简。

  • 不提供泛型,防止写出容易编写,但是难以阅读的代码。

    一段代码只会被编写一次,但是会被阅读无数次,一段泛型函数无疑会提高阅读源码的理解门槛。

    泛型函数往往被很多相互之间无关联的代码调用,但是一旦其中一个调用的需求发生变化,就需要重新理解泛型函数并重写一个新的函数,可能造成更加严重的代码重复。

  • Go 的高度克制,使开发者开发的时候能够保持最低的心智负担。