我們為什麼要使用GO語言?

drdobbs發表於2012-08-21

  GO作為一門新興語言,為什麼會在眾多新語言中脫穎而出?為什麼曾一度出現在TIOBE排行榜上面,在本文中我們就來為大家解開其中的神祕面紗。

  Go是一種根本性的反思本機語言,在很大程度上改善了C語言的不足地方並且保持了C的極簡主義。已經有好多程式設計師都把Go語言描述為是一種所見即所得(WYSIWYG)的程式語言。這是說,程式碼要做的事和它在字面上表達的意思是完全一致的。

  在這些新語言中,包含D,GO,Rust和Vala語言,GO曾一度出現在TIOBE的排行榜上面。與其他新語言相比,GO的魅力明顯要大很多。GO的成熟特徵會得到許多開發者的欣賞,而不僅僅是因為其誇大其詞的曝光度。下面我們來一起探討一下谷歌開發的GO語言以及談談GO為什麼會吸引眾多開發者:

快速簡單的編譯

  GO編譯速度很快,如此快速的編譯使它很容易作為指令碼語言使用。關於編譯速度快主要有以下幾個原因:首先,GO不使用標頭檔案;其次如果一個模組是依賴A的,這反過來又取決於B,在A裡面的需求改變只需重新編譯原始模組和與A相依賴的地方;最後,物件模組裡面包含了足夠的依賴關係資訊,所以編譯器不需要重新建立檔案。你只需要簡單地編譯主模組,專案中需要的其他部分就會自動編譯,很酷,是不是?

通過返回數值列表來處理錯誤資訊

  目前,在本地語言裡面處理錯誤的方式主要有兩種:直接返回程式碼或者拋異常。這兩種都不是最理想的處理方式。其中返回程式碼是非常令人沮喪的,因為返回的錯誤程式碼經常與從函式中返回的資料相沖突。GO允許函式返回多個值來解決這個問題。這個從函式裡面返回的值,可以用來檢查定義的型別是否正確並且可以隨時隨地對函式的返回值進行檢查。如果你對錯誤值不關心,你可以不必檢查。在這兩種情況下,常規的返回值都是可用的。

簡化的成分(優先於繼承)

  通過使用介面,型別是有資格成為物件中一員的,就像Java指定行為一樣。例如在標準庫裡面的IO包,定義一個Writer來指定一個方法,一個Writer函式,其中輸入引數是位元組陣列並且返回整數型別值或者錯誤型別。任何型別實現一個帶有相同簽名的Writer方法是對IO的完全實現,Writer介面。這種是解耦程式碼而不是優雅。它還簡化了模擬物件來進行單元測試。例如你想在資料庫物件中測試一個方法,在標準語言中,你通常需要建立一個資料庫物件,並且需要進行大量的初始化和協議來模擬物件。在GO裡面,如果該方法需要實現一個介面,你可以建立任何對該介面有用的物件,所以,你建立了MockDatabase,這是很小的物件,只實現了幾個需要執行和模擬的介面——沒有建構函式,沒有附件功能,只是一些方法。

簡化的併發性

  相對於其他語言,併發性在GO裡面顯得更加容易。把‘go’關鍵字放在任意函式前面然後那個函式就會在其go-routine自動執行(一個很輕的執行緒)。go-routines是通過通道進行交流並且基本上封鎖了所有的佇列訊息。普通工具對相互排斥是有用,但是GO通過使用通道來踢掉併發性任務和座標更加容易。

優秀的錯誤訊息

  所有與GO相似的語言,自身作出的診斷都是無法與GO相媲美的。例如,一個死鎖程式,在GO執行時會通知你目前哪個執行緒導致了這種死鎖。編譯的錯誤資訊是非常詳細全面和有用的。

其他

  這裡還有許多其他吸引人的地方,下面就一概而過的介紹一下,比如高階函式、垃圾回收、雜湊對映和可擴充套件的陣列內建語言(部分語言語法,而不是作為一個庫)等等。

  當然,GO並不是完美無瑕。在工具方面還有些不成熟的地方和使用者社群較小等,但是隨著谷歌語言的不斷髮展,肯定會有整治措施出來。儘管許多語言,尤其是D、Rust和Vala旨在簡化C++並且對其進行簡化,但它們給人的感覺仍是“C++看上去要更好”。但是在GO語言中,有一個如何操作土著語言的根本性反思,從這個角度去看,在GO裡面已經有許多優雅的實現,並且廢除了許多C或者C++中存在的問題。儘管你可能還沒嘗試使用GO,可一旦你使用以後,你就會被它許多獨特的“氣質”所吸引。

英文出自:drdobbs

相關文章