Go 可能是我继C/C++和Python之后学的第一门语言了,但在体验了数个其他语言后,发现Go还是真香。
本文含有大量主观观点,没错我就是要开团,也仅能代表个人的观点。
犯下了怠惰之罪的Python
Python怠惰就怠惰在竟然把所有依赖做到一个环境里去,于是各种依赖版本不可避免的就开始打架,代码还没写,环境先变成了屎山。此外就是慢,不过当作一个脚本语言的话也不用期望太多。
干脆都用Poetry得了,有一个正常语言该有的lockfile,所有问题都能得到解决。
犯下了傲慢之罪的Java
Java就是依托答辩,语法像C却没有一点C的轻捷,但对象这回事属实烙印在了Java的深处。读取stdin要定义一个Scanner
对象,对字符串做操作要定义一个StringBuilder
或者StringBuffer
而不是String
,不胜枚举。用户自己定义的也是一样,明明没有面向对象的需要却非要做成一个对象,连带着画出那诡异的UML图,如果面向对象味儿不够还要再用各种设计模式包装,观察者,单例,工厂……能不能别给自己加那么多戏。
终于做完了一个项目,自信地点击了Gradle Build,过了好久还没完成,于是睡了一觉,终于build完成了。打开它,可用内存便无影无踪,别人30MB能解决的问题Java搞上300MB。
犯下了暴食之罪的JavaScript
我不喜欢JavaScript的地方是它的依赖管理。其实应该说Node.js的依赖管理才更加合适,但现代的前端开发,又很难离得开Node.js。首先拦在面前的便是一大串包管理器,npm、yarn、pnpm,各自宣称解决了一些问题,但各自又有各自的lock文件。何况最烂但用得最广泛的npm会在你的每一个源代码目录中拉一坨.node_modules,随便起一个小页面,300MB没了,稍复杂的页面奔着1GB去了,而这npm install
还经常由于各种奇奇怪怪的问题失败。
另可参阅:Programs are dead
犯下了贪婪之罪的Kotlin
不得不说Kotlin还是缓解了大量Java的不足,大大简化了各种繁琐的模式。单例,直接上 object
或者 companion object
;观察者模式,一个by
关键字就能解决。换成Java,不知道要打多少snippet。此外还有各种把if赋值上提之类的语法糖,确实应了那句话,甜到齁。此外和Java类的互操作性也十分舒适。在开发Android应用时感觉到这俩简直是天造地设,完美契合。
但毕竟Kotlin设计之初就是为了在某种程度上与Java共存的,各种设计模式再简化也只能是语法简化。此外还有那又笨又重的JVM,完全逃不过去。
犯下了怠惰之罪的C
我说C为什么摆烂,C有底气的啊,看到C就像看到了汇编,一目了然。这倒是一种独特的优势,除了memory safety之外十分适合偏向底层的开发,也没有Rust那么难学。但客观上,缺少诸多现代特性确实给C成为一个广泛用于应用软件的语言拖了后腿。
至于C++,我感觉挺难说,坚持ABI兼容的后果,到现在还未知,但至少Google已经出去单干了。
在我看来Golang就是if err != nil
还不够优雅了,不过似乎Go 1.20会缓解这个问题。我真不想写try-catch。