使用Go語(yǔ)言一段時(shí)間的感受

作者 | jhfnetboy

有一段時(shí)間沒(méi)更新了。最近在忙一個(gè)Server+Client的項(xiàng)目,Client是Android手機(jī),大概也就是幾十的規(guī)模。Server是純Golang實(shí)現(xiàn),沒(méi)有apache或者ngix這種web server,也沒(méi)有數(shù)據(jù)庫(kù),自己寫(xiě)了個(gè)文件管理module,handle這種小規(guī)模的服務(wù)沒(méi)問(wèn)題。算下來(lái)接觸Golang也有四個(gè)多月了,斷斷續(xù)續(xù)寫(xiě)了一些東西,這里紀(jì)錄一下心得吧

先大概說(shuō)下為什么用Golang。我是一個(gè)對(duì)語(yǔ)言有潔癖的人,曾經(jīng)是一個(gè)c+Python的堅(jiān)定吶喊者,最常說(shuō)的一句話就是,只要熟練這兩種,什么情況都能應(yīng)付,根本不用Java和C++(純指我所在的領(lǐng)域)。核心代碼用c,速度快,需要記的語(yǔ)言細(xì)節(jié)少;外圍用Python glue,靈活,簡(jiǎn)潔,任何模塊都容易上手,絕配。Java的繁瑣,C++的無(wú)數(shù)無(wú)用的特性,都讓我只在不得不用的時(shí)候才去用。Objective-C是另一個(gè)我欣賞的語(yǔ)言,問(wèn)題是不跨平臺(tái),過(guò)于封閉。

可惜的是,在這個(gè)節(jié)奏極快的時(shí)代,不是所有情況下都適合上c。之前有一個(gè)項(xiàng)目也是類(lèi)似的架構(gòu)和規(guī)模,為了節(jié)省時(shí)間,當(dāng)初幾乎沒(méi)有服務(wù)器平臺(tái)編程經(jīng)驗(yàn)的我,在服務(wù)器端選擇用Django+Apache+MySQL做,成熟,社區(qū)活躍,又是python作為主要開(kāi)發(fā)語(yǔ)言,這些都是這個(gè)選擇的原因。說(shuō)實(shí)話,幾個(gè)月過(guò)去后,回首看,這不是一個(gè)愉快的經(jīng)歷。

Django是一個(gè)好架構(gòu),大而全,而大而全有時(shí)也就意味著臃腫,五花八門(mén)的配置,過(guò)緊的模塊耦合對(duì)引入第三方工具限制頗多,自帶的ORM又不好用。之前從來(lái)沒(méi)有搞過(guò)服務(wù)器配置的我,對(duì)Apache的配置和效率所帶來(lái)的瑣碎的東西也頭疼。

總的來(lái)說(shuō)這個(gè)部分花了我很多時(shí)間,有新手學(xué)習(xí)服務(wù)器編程的必經(jīng)過(guò)程,也有折騰Django和Apache沒(méi)必要的時(shí)間浪費(fèi),很大部分上抵消了Python帶來(lái)的快速開(kāi)發(fā)的靈活性。而一旦服務(wù)器上線,動(dòng)態(tài)語(yǔ)言帶來(lái)的一些bug又會(huì)讓人頭疼。對(duì)于普通高校實(shí)驗(yàn)室這種沒(méi)有完善的服務(wù)器調(diào)試的條件,基本就是改了就上線用,有些隱蔽bug到某些條件分支才會(huì)觸發(fā),一旦在運(yùn)行中途出問(wèn)題,改起來(lái)也麻煩。

從那時(shí)起,我就特別想,要是有一種語(yǔ)言能把c和Python的優(yōu)點(diǎn)結(jié)合起來(lái),也就是說(shuō)

  • 速度快,高性能

  • 簡(jiǎn)潔明了,需要記的語(yǔ)言細(xì)節(jié)少,開(kāi)發(fā)迅速(c)

  • 靈活,開(kāi)發(fā)快速,類(lèi)Python的list,map等常用數(shù)據(jù)結(jié)構(gòu)支持(Python)

  • 完善的模塊支持,模塊也容易上手(Python)

  • 對(duì)程序員友好的并行架構(gòu)(Erlang)

  • 安全,絕大部分問(wèn)題能消滅在compile time中(C minus pointer)

那基本就是系統(tǒng)級(jí)和網(wǎng)絡(luò)級(jí)編程最對(duì)我胃口的語(yǔ)言了。
然后我就找到了Go。

Golang是一個(gè)新語(yǔ)言,截至目前為止,第一版正式版還沒(méi)有發(fā)布。Golang的設(shè)計(jì)者是Robert Griesemer, Rob Pike和Ken Thompson,當(dāng)年設(shè)計(jì)C和Unix,后來(lái)的Plan9團(tuán)隊(duì)中的人 。Golang的設(shè)計(jì)理念很明確,就是將動(dòng)態(tài)類(lèi)型語(yǔ)言的編程容易度和靜態(tài)類(lèi)型語(yǔ)言的安全效率結(jié)合起來(lái)。如果你想更深入了解Golang的發(fā)展歷史以及完整的目標(biāo),請(qǐng)參考Golang FAQ。

當(dāng)然,Golang吸引我的地方,不是因?yàn)槠涫荊oogle出品,也不是因?yàn)槠湓O(shè)計(jì)者皆為大牛,而是因?yàn)?,Golang真的做到了它所宣稱(chēng)的目標(biāo)。Golang就如同C和Python中間的完美結(jié)合,如果你是Python愛(ài)好者,又追求代碼的速度和并行化,那么簡(jiǎn)單說(shuō),Golang就是為你設(shè)計(jì)的。Golang有很濃厚的C的遺風(fēng),盡量屏蔽C++和Java的影響,比如沒(méi)有獨(dú)立的OO體系(并不是說(shuō)不能OO),一切以struct為中心,沒(méi)有exceptions(Oh yes!),仍然有指針,等等。但是,Golang又吸取了很多新語(yǔ)言的精華,并帶有自己獨(dú)特的設(shè)計(jì)。比如

1、 保留但大幅度簡(jiǎn)化指針

Golang保留著C中值和指針的區(qū)別,但是對(duì)于指針?lè)爆嵱梅ㄟM(jìn)行了大量的簡(jiǎn)化,引入引用的概念。所以在Golang中,你幾乎不用擔(dān)心會(huì)因?yàn)橹苯硬僮鲀?nèi)寸而引起各式各樣的錯(cuò)誤。

2、 多參數(shù)返回

還記得在C里面為了回饋多個(gè)參數(shù),不得不開(kāi)辟幾段指針傳到目標(biāo)函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無(wú)需使用繁瑣的exceptions體系,一個(gè)函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯(cuò)誤信息,清晰明了。

3、 Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)

如果你習(xí)慣了Python中簡(jiǎn)潔的list和dict操作,在Golang中,你不會(huì)感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會(huì)發(fā)現(xiàn)你又找到了STL的vector 和 map這對(duì)朋友。

4、 Interface

Golang最讓人贊嘆不易的特性,就是interface的設(shè)計(jì)。任何數(shù)據(jù)結(jié)構(gòu),只要實(shí)現(xiàn)了interface所定義的函數(shù),自動(dòng)就implement了這個(gè)interface,沒(méi)有像Java那樣冗長(zhǎng)的class申明,提供了靈活太多的設(shè)計(jì)度和OO抽象度,讓你的代碼也非常干凈。千萬(wàn)不要以為你習(xí)慣了Java那種一條一條加implements的方式,感覺(jué)還行,等接口的設(shè)計(jì)越來(lái)越復(fù)雜的時(shí)候,無(wú)數(shù)Bug正在后面等著你。

同時(shí),正因?yàn)槿绱?,Golang的interface可以用來(lái)表示任何generic的東西,比如一個(gè)空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類(lèi)型,因?yàn)檫@些數(shù)據(jù)類(lèi)型都不需要實(shí)現(xiàn)任何函數(shù),自然就滿(mǎn)足空interface的定義了。加上Golang的type assertion,可以提供一般動(dòng)態(tài)語(yǔ)言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯(cuò)誤。

5、 OO

Golang本質(zhì)上不是面向?qū)ο笳Z(yǔ)言,它還是過(guò)程化的。但是,在Golang中, 你可以很輕易的做大部分你在別的OO語(yǔ)言中能做的事,用更簡(jiǎn)單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因?yàn)楸举|(zhì)上,OO在Golang中,就是普通的struct操作。

6、 Goroutine

這個(gè)幾乎算是Golang的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級(jí)輕量級(jí)的類(lèi)似線程的東西,但通過(guò)它,你不需要復(fù)雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Golang里,觸發(fā)一個(gè)routine和erlang spawn一樣簡(jiǎn)單?;旧弦莆誈olang,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過(guò)請(qǐng)放心,真的非常簡(jiǎn)單。

7、 更多現(xiàn)代的特性

和C比較,Golang完全就是一門(mén)現(xiàn)代化語(yǔ)言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類(lèi)似), function是first class object,等等等等。

看到這里,你可能會(huì)發(fā)現(xiàn),我用了很多輕易,簡(jiǎn)單,快速之類(lèi)的形容詞來(lái)形容Golang的特點(diǎn)。我想說(shuō)的是,一點(diǎn)都不夸張,連Golang的入門(mén)學(xué)習(xí)到提高,都比別的語(yǔ)言門(mén)檻低太多太多。在大部分人都有C的背景的時(shí)代,對(duì)于Golang,從入門(mén)到能夠上手做項(xiàng)目,最多不過(guò)半個(gè)月。Golang給人的感覺(jué)就是太直接了,什么都直接,讀源代碼直接,寫(xiě)自己的代碼也直接。

有朋友要抗議了,你把Golang吹的這么好,難道它就沒(méi)有缺點(diǎn)?有,當(dāng)然有,不過(guò)和它的優(yōu)點(diǎn)比,我覺(jué)得很多缺點(diǎn)都是因?yàn)檎麄€(gè)語(yǔ)言太新,不成熟,隨著時(shí)間的推移都能得到解決,相比之下都能忍了。如果你希望進(jìn)一步了解Golang的優(yōu)缺點(diǎn),可以參考以下yufeng寫(xiě)的這篇文章,系統(tǒng)編程語(yǔ)言明日之星—Go

還有朋友要說(shuō),Golang這么好,為什么沒(méi)人用?我想說(shuō),眼界放開(kāi)點(diǎn),這個(gè)世界精彩的東西比你想象的多。Golang被Google用于Youtube的數(shù)據(jù)庫(kù),被越來(lái)越多的國(guó)外公司(大部分創(chuàng)業(yè)公司)用于后端開(kāi)發(fā),甚至在天朝,也有完全用Golang做服務(wù)開(kāi)發(fā)的云應(yīng)用公司了??梢哉f(shuō),隨著Go 1即將到來(lái)的正式推出,Golang的使用范圍,應(yīng)該會(huì)越來(lái)越廣。

好,總結(jié)時(shí)間

如果你是Python和動(dòng)態(tài)語(yǔ)言狂熱愛(ài)好者,Go不一定能給你帶來(lái)很大的驚喜,這純粹取決于你得項(xiàng)目性質(zhì),考慮到Python目前在很多地方都用C做核心運(yùn)算,速度在大部分情況下都不是大問(wèn)題。scalability是一個(gè)問(wèn)題,但并不是人人都會(huì)遇到的。

如果你是C愛(ài)好者,強(qiáng)烈建議你學(xué)習(xí)和使用Go。Go可以調(diào)用C/C++程序,又提供了太多的便利,速度上稍有犧牲,但并不大。在絕大部分場(chǎng)景下Go能給你帶來(lái)媲美C的性能,而對(duì)于某些確實(shí)性能過(guò)于關(guān)鍵的場(chǎng)合,也可以通過(guò)cgo讓Go和C搭配。

如果你是Java愛(ài)好者,除非你是做Android這種不得不用Java的平臺(tái),否則也建議你嘗試學(xué)習(xí)Go,這個(gè)開(kāi)發(fā)上感覺(jué)的差異如同比較開(kāi)載著1噸石頭的拖拉機(jī)和開(kāi)保時(shí)捷911那么明顯,而Java能給你的,Go能給得更好。

如果你是C++愛(ài)好者,!@#$%^&*,恭喜你,至少你的智商應(yīng)該是沒(méi)問(wèn)題的。人生苦短,趕緊脫離C++這個(gè)苦海吧。你用來(lái)學(xué)89個(gè)C++高級(jí)特性的時(shí)間,估計(jì)已經(jīng)用Go寫(xiě)了64個(gè)開(kāi)源項(xiàng)目了。

如果你是像我一樣的C和Python的愛(ài)好者,對(duì)動(dòng)態(tài)語(yǔ)言又沒(méi)有特殊的熱愛(ài)……我還需要說(shuō)什么呢?

讓我們蕩起雙槳,去遨游Golang的海洋吧。

原文轉(zhuǎn)自:https://segmentfault.com/a/1190000002410848

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容