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

作者 | jhfnetboy

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

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

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

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

總的來說這個部分花了我很多時間光坝,有新手學(xué)習(xí)服務(wù)器編程的必經(jīng)過程尸诽,也有折騰Django和Apache沒必要的時間浪費(fèi),很大部分上抵消了Python帶來的快速開發(fā)的靈活性盯另。而一旦服務(wù)器上線性含,動態(tài)語言帶來的一些bug又會讓人頭疼。對于普通高校實驗室這種沒有完善的服務(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è)計者是Robert Griesemer, Rob Pike和Ken Thompson管行,當(dāng)年設(shè)計C和Unix厨埋,后來的Plan9團(tuán)隊中的人 。Golang的設(shè)計理念很明確捐顷,就是將動態(tài)類型語言的編程容易度和靜態(tài)類型語言的安全效率結(jié)合起來荡陷。如果你想更深入了解Golang的發(fā)展歷史以及完整的目標(biāo)雨效,請參考Golang FAQ。

當(dāng)然废赞,Golang吸引我的地方徽龟,不是因為其是Google出品,也不是因為其設(shè)計者皆為大牛唉地,而是因為据悔,Golang真的做到了它所宣稱的目標(biāo)。Golang就如同C和Python中間的完美結(jié)合耘沼,如果你是Python愛好者屠尊,又追求代碼的速度和并行化,那么簡單說耕拷,Golang就是為你設(shè)計的讼昆。Golang有很濃厚的C的遺風(fēng),盡量屏蔽C++和Java的影響骚烧,比如沒有獨(dú)立的OO體系(并不是說不能OO)浸赫,一切以struct為中心,沒有exceptions(Oh yes!)赃绊,仍然有指針既峡,等等。但是碧查,Golang又吸取了很多新語言的精華运敢,并帶有自己獨(dú)特的設(shè)計。比如

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

Golang保留著C中值和指針的區(qū)別传惠,但是對于指針繁瑣用法進(jìn)行了大量的簡化,引入引用的概念稻扬。所以在Golang中卦方,你幾乎不用擔(dā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è)計。任何數(shù)據(jù)結(jié)構(gòu)渺氧,只要實現(xiàn)了interface所定義的函數(shù)旨涝,自動就implement了這個interface,沒有像Java那樣冗長的class申明侣背,提供了靈活太多的設(shè)計度和OO抽象度白华,讓你的代碼也非常干凈。千萬不要以為你習(xí)慣了Java那種一條一條加implements的方式贩耐,感覺還行弧腥,等接口的設(shè)計越來越復(fù)雜的時候,無數(shù)Bug正在后面等著你潮太。

同時管搪,正因為如此,Golang的interface可以用來表示任何generic的東西铡买,比如一個空的interface更鲁,可以是string可以是int,可以是任何數(shù)據(jù)類型奇钞,因為這些數(shù)據(jù)類型都不需要實現(xiàn)任何函數(shù)岁经,自然就滿足空interface的定義了。加上Golang的type assertion蛇券,可以提供一般動態(tài)語言才有的duck typing特性缀壤, 而仍然能在compile中捕捉明顯的錯誤。

5纠亚、 OO

Golang本質(zhì)上不是面向?qū)ο笳Z言塘慕,它還是過程化的。但是蒂胞,在Golang中图呢, 你可以很輕易的做大部分你在別的OO語言中能做的事,用更簡單清晰的邏輯。是的蛤织,在這里赴叹,不需要class,仍然可以繼承指蚜,仍然可以多態(tài)乞巧,但是速度卻快得多。因為本質(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,從入門到能夠上手做項目盔几,最多不過半個月晴弃。Golang給人的感覺就是太直接了,什么都直接问欠,讀源代碼直接,寫自己的代碼也直接粒蜈。

有朋友要抗議了顺献,你把Golang吹的這么好,難道它就沒有缺點(diǎn)枯怖?有注整,當(dāng)然有,不過和它的優(yōu)點(diǎn)比度硝,我覺得很多缺點(diǎ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不一定能給你帶來很大的驚喜漓滔,這純粹取決于你得項目性質(zhì)编饺,考慮到Python目前在很多地方都用C做核心運(yùn)算,速度在大部分情況下都不是大問題响驴。scalability是一個問題透且,但并不是人人都會遇到的。

如果你是C愛好者豁鲤,強(qiáng)烈建議你學(xué)習(xí)和使用Go秽誊。Go可以調(diào)用C/C++程序,又提供了太多的便利琳骡,速度上稍有犧牲锅论,但并不大。在絕大部分場景下Go能給你帶來媲美C的性能楣号,而對于某些確實性能過于關(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īng)用Go寫了64個開源項目了扳缕。

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末省古,一起剝皮案震驚了整個濱河市粥庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豺妓,老刑警劉巖惜互,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件布讹,死亡現(xiàn)場離奇詭異,居然都是意外死亡训堆,警方通過查閱死者的電腦和手機(jī)描验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坑鱼,“玉大人膘流,你說我怎么就攤上這事÷沉ぃ” “怎么了呼股?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長画恰。 經(jīng)常有香客問我彭谁,道長,這世上最難降的妖魔是什么阐枣? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任马靠,我火速辦了婚禮奄抽,結(jié)果婚禮上蔼两,老公的妹妹穿的比我還像新娘。我一直安慰自己逞度,他們只是感情好额划,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著档泽,像睡著了一般俊戳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馆匿,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天抑胎,我揣著相機(jī)與錄音,去河邊找鬼渐北。 笑死阿逃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赃蛛。 我是一名探鬼主播恃锉,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呕臂!你這毒婦竟也來了破托?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤歧蒋,失蹤者是張志新(化名)和其女友劉穎土砂,沒想到半個月后州既,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘟芝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年易桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌俱。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晤郑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贸宏,到底是詐尸還是另有隱情造寝,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布吭练,位于F島的核電站诫龙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲫咽。R本人自食惡果不足惜签赃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望分尸。 院中可真熱鬧锦聊,春花似錦、人聲如沸箩绍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽材蛛。三九已至圆到,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卑吭,已是汗流浹背芽淡。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豆赏,地道東北人挣菲。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像河绽,于是被迫代替她去往敵國和親己单。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • TITLE: 編程語言亂燉 碼農(nóng)最大的煩惱——編程語言太多耙饰。不是我不學(xué)習(xí)纹笼,這世界變化快! 有時候還是蠻懷念十幾苟跪、二...
    碼園老農(nóng)閱讀 5,318評論 2 35
  • 特殊字符 ^ $ * ? + {2} {2,} {2,5} | [] [^] [a-z] . \s \S ...
    聽城閱讀 207評論 0 1
  • 所有的發(fā)生不是 ‘針對 ’我發(fā)生 廷痘,而是 ‘為 ’我發(fā)生 蔓涧。 這是受害者與修行者的不同心態(tài) 。
    wform閱讀 177評論 0 1
  • 今日起身后發(fā)現(xiàn)自己是一粒與春季的軟風(fēng)失之交臂的種子,失重地坐在這里兄猩,和一些異軍突起的念頭一起一蹶不振茉盏。 今日我在d...
    桜井琢磨閱讀 271評論 0 0