2018年6月,我从工作了5年的公司辞职。离开的原因很简单:想出去看看,看看外面你们公司是做什么业务的?它使用什么技术?离职前一周,我收到了华为、中国联通和我现在所在公司的offer。之所以没去华为和联通,是因为他们不是互联网公司。我喜欢他们。就是互联网公司的开放氛围。这种开放的技术氛围让人成长更快,接触到最前沿的技术。而我最终选择的公司就是这样一家技术氛围好,商业模式新颖的公司。进入这家互联网公司后,首先接触的当然是Java项目,而且是一个只有需求没有代码的新项目。从需求分析到架构设计、模型设计、代码编写,基本上都是我自己完成的。这个Java项目的开发完成并在大约2个月内上线。后续的工作就是一些简单的维护,一些新的需求和一些功能的调整。刚进公司三个月,TeamLeader给我扔了一个Go语言的项目。当然这个项目我也看过,但是当时不懂Go语言,所以TeamLeader没有让我做相关的开发。工作。现在因为人事变动要接手这个项目,于是开始学习Go语言,同时开始了我的第二门计算机语言。刚接触Go语言的时候,我并没有开始找相关资料学习,而是开始阅读TL给我的Go项目,让他给我解释项目的主要业务逻辑,包括入口方法,调用链,想通之后就开始看这个项目了。事实上,如果你接触过其他计算机语言,阅读Go项目是没有问题的。尽管Go中的数据类型、方法入参、返回值和我们以前的语言写法不一样,但是不妨碍你了解这门语言的特点。尤其是接触过JavaScript语言的开发者,更容易接受Go语言,因为它的方法和参数定义与JavaScript的方法和参数定义非常相似。比如:参数用var定义,方法用function定义。当然,JavaScript是一种弱类型语言。它没有Go语言中的int、int32、int64、string等强类型语言的数据类型,但是它们的一些关键字和写法与Go语言非常相似。熟悉JavaScript的开发者自然对Go语言有很好的印象。我花了两天时间来熟悉这个Go项目。当然,在熟悉项目的过程中,我也对其语法有了一定的了解。然后开始接受TL给我的新要求,开始coding。我以“跟猫画虎”的方式一个接一个地完成了新的要求。写代码的时候,我会查资料,比如:Go中strconv中的各种方法,Java中所有你可以对String进行操作的方法,在Go语言中找找,如果找不到,再找再说一遍,如果还是找不到,那就自己实现一个。通过边写Go语言代码边查相关资料,我很快对这门语言有了更多的了解,我知道它天生就是一门为分布式高并发系统设计的语言。同样的服务器配置,Go语言可以轻松实现4000QPS的业务逻辑,但是使用Java并不容易,需要是各种性能用户,这都得益于Go语言的协程设计。协程不同于线程。协程是语言本身的机制,多任务调度是由语言自身的机制来完成的。线程不是语言的特性,需要容器来调度。比如我们常见的Java中的多线程,Java中的多线程是通过tomcat、jetty等web容器进行调度的,所以多线程的性能取决于容器的调度性能。我们开发者很难优化容器的调度性能。比如在4G8G的服务器上,tomcat要跑3000QPS(不是简单的输出helloword)是非常困难的,但是同样的配置下,Go语言能跑5000QPS就辛苦了!当然,Go语言也有自身的局限性,一个重要的局限性就是弱事务。我们都知道Java中的Spring框架为我们提供了事务性。我们可以保证我们一次请求的多个操作要么全部失败然后回滚,要么全部成功。它具有很强的事务性,因此我们可以使用Java语言来编写银行、支付等系统的程序。但是Go语言并没有严格强调事务性,事务性强势必导致并发性能的损失。因此,如果你的系统能够接受一定程度的数据不一致,你可以选择Go语言。当然这也不是绝对的,因为我们也可以通过MQ等手段来解决数据不一致的问题。那么GO语言的使用场景就大得多了。学习一门编程语言最好的方法,绝对不是一开始就去阅读它的相关技术文档。如果我们有机会参与实际的项目开发,那么我们应该积极参与其中。通过在实际业务场景中使用这门计算机语言,我们可以快速掌握这门语言的特点。这种学习方法是最快最有效的学习方法。只有实际使用过才能真正理解。“纸上谈兵”永远无法战胜真正的敌人。接触Go语言是出于实际需要,但通过使用,我发现它真的“很香”。如果你想搭建自己的高并发系统,或者想将你当前系统的并发性能提升一个数量级,Go语言是你最好的选择。今后,不妨学着用着,你会觉得它“很香”。
