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