作者 | 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