Golang 大半年使用感受

去年下半年开始在公司写 Go。选它只有一个原因,我想要 C++ 的性能但是又嫌 C++ 的开发效率不够。到现在已经把整个后端团队的大牛们吸引到 Go 阵营,回顾整个历程,应该算利大于弊。总得来说我认为 Go 是一门不错的语言,但算不上特别优秀。

程序员在网上讨论编程语言的时候,要么喜欢像宗教信仰一样盲目站队,要么喜欢抓着几个酷炫名词本末倒置,略显呆逼。其实甄别一门语言的利弊挺简单,不用像垠神一样洞悉「本质」,说白了一门语言对你造成重大影响的就四个东西:性能,行数,易理解度,坑的多寡深浅(包括网上的相关资料和第三方类库)。

性能方面

Go 的性能基本上只输 C 家族,最坏情况也就慢几倍(不像某些流行语言慢几十上百倍),就算用来实现对性能要求苛刻的算法也算不上浪费 CPU。但如果看广义的性能,把并发算进去,还是比较爽的。像 Ruby / Python 这类被 GIL 束缚手脚的语言就不说了,而相比那些直接操作系统级线程/进程的语言来说,速度优势就很明显。当然,很多语言也可以包一个轻量级线程的实现,但问题就出在这里,他们官方没做这个事情,这种命根子需求使用第三方库会带来很多隐患。

行数方面

这是 Go 的小劣势,总体表现力不如 Ruby / Python / Scala / 各种 FP。其中矬爆九天、蛋菊俱焚的一点是:它没有泛型,以至于一个最简单的数组的 reverse 都得给每个类型实现一次。有人可能会说,用 interface{} 或者 reflect 什么的也可以,但从此程序的稳定性会走向不归路。但无论如何,它比 C 家族代码要短,如果能灵活运用闭包、defer,可以省不少事情。另外如果是并发逻辑比较复杂的场景,把 chan、select 用好,代码可以比任何语言都短。

易理解度

跟大多数语言区别不明显。但我最近读了一些 C 家族的代码,已经觉得有点不习惯了。我发现 C 家族的代码有很大一部分是浪费在语言本身的破事上,Java 也好不到哪里去。这么一说 Go 还是应该算中上水平。

目前我司在使用 Go 遇到的所有坑在网上都比较容易找到解决方案。官方文档齐全,源码也精简易懂。第三方的东西不算多,但比起像 nodejs 那些稀巴烂的第三方库质量好太多。有一点值得注意的是,我司没有专门测试的员工,但 Go 实现的服务 bug 很少,基本上 bug 都是对业务理解的问题(或是偷懒啥的)所导致,而且 bug 出现之后对服务的影响都能被控制在一个范围里,这是一件很好的事情。不会像以前写 C 家族时候出现指针乱飞、内存写乱的状况,也没有 Python 同事经常出现的变量名 typo 问题(你见过几个人爱用静态检查工具?),换句话说,Go 的程序健壮程度跟 Java 系列相仿。

印象比较深刻的就这些。对于我来说,如果 Go 把泛型补上,然后加点儿 Ruby 味的语法糖就比较完美了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。