使用Go語言一段時間的感受

作者 | jhfnetboy

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

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

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

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

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

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

  • 速度快,高性能

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

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

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

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

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

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

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

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

1、 保留但大幅度簡化指針

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

2、 多參數(shù)返回

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

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

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

4、 Interface

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

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

5、 OO

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

6、 Goroutine

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

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

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

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

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

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

好,總結(jié)時間

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

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

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

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

如果你是像我一樣的C和Python的愛好者,對動態(tài)語言又沒有特殊的熱愛……我還需要說什么呢?

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內(nèi)容