這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。GO作為一門新興語言,為什麼會在眾多新語言中脫穎而出?為什麼曾一度出現在TIOBE熱門排行榜上面,在本文中我們就來為大家解開其中的神秘面紗。
Go是一種根本性的反思母語,在很大程度上改善了C語言的不足地方並且保持了C的極簡主義。已經有好多程式員都把Go語言描述為是一種所見即所得 (WYSIWYG)(WYSIWYG)的程式設計語言。這是說,代碼要做的事和它在字面上表達的意思是完全一致的。
在這些新語言中,包含D,Go,Rust和Vala語言,Go曾一度出現在TIOBE的熱門排行榜上面。與其他新語言相比,Go的魅力明顯要大很多。Go的成熟特徵會得到許多開發人員的欣賞,而不僅僅是因為其誇大其詞的曝光度。下面我們來一起探討一下Google開發的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並不是完美無瑕。在工具方面還有些不成熟的地方和使用者社區較小等,但是隨著Google語言的不斷髮展,肯定會有整治措施出來。儘管許多語言,尤其是D、Rust和Vala旨在簡化C++並且對其進行簡化,但它們給人的感覺仍是“C++看上去要更好”。但是在Go語言中,有一個如何操作本地語言的根本性反思,從這個角度去看,在Go裡面已經有許多優雅的實現,並且廢除了許多C或者C++中存在的問題。儘管你可能還沒嘗試使用Go,可一旦你使用以後,你就會被它許多獨特的“氣質”所吸引。
文章來源:編程網 http://www.ftnanke.com