我被迫選擇了Go語言,但是現(xiàn)在發(fā)現(xiàn)它真的“很香”
2018年6月我從工作了5年的公司離職了,離職的原因很簡單:想出去看一看,看外面的公司都在做什么業(yè)務(wù)?使用什么技術(shù)?
在離職的前一周,我拿到了華為、聯(lián)通和我現(xiàn)在所在公司的offer,之所以沒去華為和聯(lián)通是因?yàn)樗鼈兌疾皇腔ヂ?lián)網(wǎng)公司,我喜歡的是互聯(lián)網(wǎng)公司那種開放的氛圍,這種開放的技術(shù)氛圍更能讓人獲得更快的成長,接觸到最前沿的技術(shù)。而我最終選擇的公司就是這樣的一家公司,技術(shù)氛圍好、業(yè)務(wù)模式新穎。
進(jìn)入這家互聯(lián)網(wǎng)公司以后,開始我接觸的當(dāng)然是Java的一個(gè)項(xiàng)目,而且是一個(gè)只有需求還沒有代碼的新項(xiàng)目。從需求分析到架構(gòu)設(shè)計(jì)、模型設(shè)計(jì)、代碼編寫都基本是我一個(gè)人完成。差不多2個(gè)月的時(shí)間這個(gè)Java的項(xiàng)目就開發(fā)完成并上線,后續(xù)的工作就是一些簡單的維護(hù)和一些新的需求以及一些功能的調(diào)整。
進(jìn)入公司三個(gè)月的時(shí)候,我的Team Leader扔給我一個(gè)Go語言項(xiàng)目,當(dāng)然這個(gè)項(xiàng)目我之前已經(jīng)看到過,但是當(dāng)時(shí)我并不懂Go語言,所以Team Leader并沒讓我做相關(guān)的開發(fā)工作?,F(xiàn)在因?yàn)槿藛T的變動(dòng)我必須要接手這個(gè)項(xiàng)目,所以我開始學(xué)習(xí)Go語言,也同時(shí)開啟了我的第二計(jì)算機(jī)語言之路。

初次接觸Go語言的時(shí)候,我并沒有一開始就去找相關(guān)的資料去學(xué)習(xí),而是開始看TL給我的這個(gè)Go項(xiàng)目,讓他給我講解了這個(gè)項(xiàng)目的主要業(yè)務(wù)邏輯,包括入口類方法、調(diào)用鏈,弄清楚這些我就開始看這個(gè)項(xiàng)目。其實(shí)如果接觸過其它計(jì)算機(jī)語言的話,閱讀Go項(xiàng)目一點(diǎn)問題都沒有。即使Go中的數(shù)據(jù)類型、方法入?yún)ⅰ⒎祷刂档膶懛ǜ覀円酝恼Z言不一樣,但并不妨礙你理解這門語言的特性。尤其是接觸過JavaScript語言的開發(fā)人員來說,更容易接受Go語言,因?yàn)樗姆椒ê蛥?shù)定義和JavaScript對于方法和參數(shù)的定義很像。例如:都是通過var來定義參數(shù),方法都是以function定義,當(dāng)然JavaScript是一門弱類型的語言,它沒有像Go語言的int、int32、int64、string等強(qiáng)類型語言具有的數(shù)據(jù)類型,但是他們的某些關(guān)鍵字和寫法與Go語言很相像,熟悉JavaScript的開發(fā)者天然的對Go語言有好感。
我用兩天的時(shí)間熟悉完了這個(gè)Go項(xiàng)目,在熟悉項(xiàng)目的過程中我當(dāng)然也對它的語法有了一定的了解。然后我就開始接受TL給我的新需求并開始編碼工作。我“照貓畫虎”式的完成了一個(gè)個(gè)的新需求,在編寫代碼的時(shí)候,我會(huì)去查資料,例如:Go中的strconv中的各種方法,凡是你在Java中關(guān)于String操作的方法都能在Go語言找到,如果找不到,那就再找一遍,如果還是找不到,那就自己實(shí)現(xiàn)一個(gè)。通過一邊編寫Go語言代碼一邊查相關(guān)資料,我很快對這門語言了解的更深入了,我知道它天生就是為分布式高并發(fā)系統(tǒng)設(shè)計(jì)的語言。同樣的服務(wù)器配置,Go語言能輕松實(shí)現(xiàn)4000QPS的業(yè)務(wù)邏輯,但是用Java就不太容易,需要做各種性能用戶,這都得益于Go語言的協(xié)程設(shè)計(jì)。
協(xié)程不同于線程,協(xié)程是語言本身的機(jī)制,靠語言自身的機(jī)制去做多任務(wù)的調(diào)度,而線程并不是語言的特性,它需要靠容器來調(diào)度。例如我們常見的Java中的多線程,Java中的多線程是要靠tomcat、jetty等web容器去調(diào)度,所以多線程的性能取決于容器的調(diào)度性能。而容器的調(diào)度性能我們開發(fā)者很難去優(yōu)化,就如一臺(tái)4G8G的服務(wù)器,tomcat跑3000的QPS都很吃力(不是簡單的輸出hello word),而同等配置下,Go語言跑5000的QPS都不費(fèi)力!
當(dāng)然Go語言有它自身的局限性,一個(gè)重要的局限性就是弱事務(wù)。我們都知道Java中的Spring框架為我們提供了事務(wù)性,我們可以保證我們一次請求的多個(gè)操作要么全部失敗,然后回滾,要么全部成功,它具有很強(qiáng)的事務(wù)性,所以我們可以用Java語言來編寫銀行、支付等系統(tǒng)。但是Go語言并不嚴(yán)格強(qiáng)調(diào)事務(wù)性,強(qiáng)事務(wù)必然會(huì)帶來并發(fā)性能的損失。所以,如果你的系統(tǒng)可以接受一定程度的數(shù)據(jù)不一致性,那就可以選擇Go語言,當(dāng)然這不是絕對的,因?yàn)槲覀円部梢酝ㄟ^MQ等措施來解決數(shù)據(jù)的不一致性,那么GO語言的使用場景都大很多了。
學(xué)習(xí)一門編程語言最好的方式絕對不是一開始就去讀它的相關(guān)技術(shù)文檔,如果有機(jī)會(huì)我們能參與到實(shí)際的項(xiàng)目開發(fā)中,那我們應(yīng)該積極的參與其中。通過在實(shí)際業(yè)務(wù)場景對該計(jì)算機(jī)語言的使用,我們可以快速的掌握這門語言的特性,這種學(xué)習(xí)方式是最快最有成效的一種學(xué)習(xí)方式。只有真正使用過它,你才能真正了解它,“紙上談兵”永遠(yuǎn)不可能打敗真正的敵人。

接觸Go語言是實(shí)際需求所致,但通過使用它,我發(fā)現(xiàn)它真的“很香”,如果你想打造自己的高并發(fā)系統(tǒng),或者想讓自己目前的系統(tǒng)并發(fā)性能提升一個(gè)數(shù)量級,Go語言是你最好的選擇。從現(xiàn)在起,不妨學(xué)習(xí)它并使用它,你也會(huì)覺得它”很香”。