这是关于 Go 语言的笔记,包含了对 Go 语言的多个方面的思考和体验:
- 模块(Modules):阅读 Go 网站的教程后,了解到 Go 中的“模块”更类似于其他语言中的“项目”,且 Go 强制导入的标识符必须用包名限定,这使代码更易读,但 Go 中包内文件共享命名空间,导致本地标识符定义不明显,起初作者因习惯其他语言而导致项目布局尴尬。
- 错误处理(Errors):Go 的错误处理方式是将错误作为值返回,而不是抛出异常,这使得程序员需要在代码中显式处理错误,随着可能出错的操作数量增加,错误处理样板代码也会线性增长,如一个简单的文件复制函数,一半以上的代码都是用于错误处理。Rust 支持更简洁的错误处理方式,而 Go 没有类似的语法支持,虽然有官方文章讨论减少错误处理样板代码的方法,但在实际代码结构中并不总是可行,且一些自定义的错误处理方式可能会影响代码的可读性。关于错误处理的讨论也涉及到语言表达性的问题,不同语言在错误处理上有不同的设计理念。
- 表达性(Expressiveness):表达性是一个模糊且主观的质量,可用于比较编程语言。Python 表达性高,接近伪代码;Rust 则相反,代码简洁但到达工作解决方案需要更多努力;Go 介于两者之间, verbose 且充满小的语法和设计怪癖,但很少让程序员感到困惑。Go 设计倾向于简单,去除一些选择以防止误用,如缺少函数参数默认值和方法重载。
- 依赖(Dependencies):Go 在内置和标准库方面表现不均,标准库有很多“包含电池”的包,但缺少常见数据结构操作和实用工具,Go 社区倾向于避免使用外部依赖,这使得在处理基本任务时需要编写更多的自定义代码,如文件复制和单元测试辅助函数。
- 心态(Mindset):作者期望 Go 语言是简单实用的,go fmt 工具就是这种理念的体现,它为程序员做出了很多决策,提高了生产力。虽然作者不喜欢 Go 的一些设计选择,但理解构建一种满足特定目标的语言的优点,以及限制的创造性力量。
总的来说,Go 语言有其独特的设计和特点,在模块管理、错误处理、表达性和依赖等方面与其他语言有不同之处,作者对 Go 语言既有认可也有一些质疑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。