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