我們?yōu)槭裁催x擇了 Go 語言
我發(fā)現(xiàn)我花了四年時間錘煉自己用 C 語言構(gòu)建系統(tǒng)的能力,試圖找到一個規(guī)范,可以更好的編寫軟件。結(jié)果發(fā)現(xiàn)只是對 Go 的模仿。缺乏語言層面的支持,只能是一個拙劣的模仿。
這是云風(fēng)在博客中說過的一句話。最近開始做一個很有意思的個人項目,我們選擇使用 Go 來搭建后臺服務(wù),Why Go ?其實真相是:不是我們選擇了 Go ,是 Go 面向我們,選擇了我們。
出身
首先 ,不得不說一下 Go 的作者(僅選了三個代表):
- Ken Thompson
- Rob Pike
- Robert Griesemer
Ken Thompson 大家肯定不陌生,設(shè)計了 B 語言和 C 語言,Unix 之父,1983年圖領(lǐng)獎得主,Ken 老爺子在2000年的時候離開了貝爾實驗室,轉(zhuǎn)行飛行員!!!后來加入了 Google,順手寫了個 Go 。 這里 有 Ken 和他的好基友 Denise M. Ritchie的故事。
上面應(yīng)該有一張 Ken 和 Denise 的合照,如果顯示不出來,你可能被墻了,自救吧
Rob Pike 參與 Plan9 和 Inferno 操作系統(tǒng)開發(fā),Unix 小組成員。
Robert,曾協(xié)助制作Java的HotSpot編譯器和Chrome瀏覽器的JavaScript引擎V8。
按照這個配置,Go 出身于 Google,師出名門加上牛逼哄哄的作者們,語言界的富二代。
語言的設(shè)計者,很大程度決定了語言的設(shè)計哲學(xué)。在學(xué)習(xí) Go 的過程中,你會感覺到這門語言如此的簡潔優(yōu)雅,但是又不簡單。
設(shè)計哲學(xué)和特性
來說一下語言的設(shè)計哲學(xué)和特性(并不想拆開講解)。
少即是多。跟 C++ 不同的是, Go 沒有盡可能多的包含所有的特性,這只會增加了語言自身的復(fù)雜性,提高了學(xué)習(xí)成本。Go 盡可能保持簡單,甚至摒棄了繼承這一特性。使用過 Java 的程序員對此可能略感不適,畢竟在面向?qū)ο蟮木幊棠P椭校^承是非常常用的策略。而 Go 選擇使用簡單的組合的方式來構(gòu)建復(fù)雜的類型,因為繼承會提高軟件開發(fā)的復(fù)雜程度,以 Java 的集合類為例,多少學(xué)習(xí) Java 的人至今仍然道不出集合類之間的繼承關(guān)系。多用組合,少用繼承,Go 放棄了看似強(qiáng)大的語言特性,把這一理念實踐的非常徹底。
編碼規(guī)范。有些人覺得代碼規(guī)范被設(shè)計到語言本身會很奇怪,限制了語言。但實際上,Go 直接在語言層面加以約束,意義重大。曾幾何時,團(tuán)隊會因為語言的 code style 而爭論不休,code format 需要團(tuán)隊通過政策來約束,code review 可能也會因為代碼格式的問題而爭吵的面紅耳赤。Go 作為互聯(lián)網(wǎng)時代的一門語言,可以讓全世界的 Go programmer 的代碼風(fēng)格保持一致,減少了無意義的爭論,對于共享和合作意義重大。
設(shè)計規(guī)則靈活。Go 是一門多范式的編程語言。Go 開發(fā)者可以自由發(fā)揮。
面向接口編程。這也是大型軟件系統(tǒng)的一種設(shè)計哲學(xué),面向抽象,而非面向?qū)崿F(xiàn)。Go 的接口是duck類型,鴨子類型在 ruby 中非常常見。它講述的是如果一只鳥走起路來像鴨子,游泳也像鴨子,叫起來也像鴨子,那么這只鳥就是鴨子。因此 Go 的接口定義是隱式的,非侵入性的。它關(guān)注的不是對象(當(dāng)然在 Go 中我們稱之為 struct )的類型本身,而是如何使用。
異常處理和防御性編程。非常明顯的一點是 Go 的函數(shù)調(diào)用對 error 的檢查,雖然讓代碼可能并不美觀,但是為了實用性,這種級別的代碼防御也是可以接受的,減少不安全的代碼。
實踐理念。Go 自身提供了豐富的 CLI,幾乎涵蓋了整個軟件的生命周期,例如開發(fā),測試,部署,維護(hù)等環(huán)節(jié)。寫 Go 的時候,不再需要額外的IDE或者是工具在組織代碼,構(gòu)建,編譯,測試。這省去了很多麻煩,節(jié)省了開發(fā)者寶貴的時間。我們只需要關(guān)注代碼本身即可。
以上主要是關(guān)于 Go 的設(shè)計哲學(xué),其中摻雜的提到了一些特性。其實 Go 還有很多特性值得我們?nèi)ニ伎?Go 為何這樣設(shè)計,比如:與 C 語言的集成 CGo 這種語言間的交互性;匿名函數(shù)和閉包;函數(shù)多返回值;豐富的類型系統(tǒng);自動的 gc( gc 的鼻祖應(yīng)該是 lisp, 被 Java 發(fā)揮的爐火純青,v8 因有優(yōu)秀的 gc 性能得以大幅度提升,雖然這不是 Go 的專利,但是這卻讓開發(fā)者省了不少心);包管理;單元測試規(guī)范;并發(fā)和分布式;開發(fā)和執(zhí)行效率;同樣的支持跨平臺;對網(wǎng)絡(luò)開發(fā)有非常好的支持,不需要使用框架也可以很快的開發(fā)一個 web 程序。這些特性很多都不是 Go 的專利,但是 Go 卻有限的進(jìn)行了吸收和發(fā)揮。
總之,Go 被稱為21世紀(jì)的 C 語言名副其實,正因如此,在我們的新項目中,不管是從語言本身,團(tuán)隊協(xié)作,部署成本,性能等各個方面考慮,Go 是我們的不二選擇,當(dāng)然,Go 開發(fā)者現(xiàn)在并不是很多(比如相對于爛大街的 Java),但是我有理由相信,越來越多的人也會像我一樣,被 Go 所吸引,并且也選擇 Go 。