假期的目標go語言
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
目前這個GO社區非常活躍,郵件清單裡每天都有幾百個討論,加上有Google的強力支援, 個人認為非常有前途。
那麼GO能解決什麼問題:
1. 硬體很快 軟體開發很慢。
2. 依賴很麻煩。
3. c++ java太笨拙。
4. 並行和gc
5. 多核心機器的出現,未來幾年128核心的機器都很常見。
大部分的系統語言並不是設計來解決這些問題的,而且新湧現的大多數庫並沒有改善這些問題,相反加劇了。
GO結合了動態語言的開發效率和靜態編譯型語言的安全性和運行效率,支援網路和多核編程,帶給我們快速, 安全, 並發, 快樂。
Go有著非常高的效率。 實際上golang.org就是用gdoc架設的。同時語言效能評測網站() Go和其他語言的對比,也充分說明了Go的效率和c語言很接近。
GO的設計目標:
1. 系統程式設計語言。
2. 快速編譯和執行。
3. 型別安全和記憶體使用量安全。
4. 很好的支援並發計算。
5. 高效,低延遲的記憶體回收演算法。
指導原則:
1. 減少bookkeeping。
2. 更少的關鍵詞,減少無謂的輸入。無符號表設計使得文法分析,調試等大幅簡單。
3. 保持概念正交
4. 保持簡單。
5. 減少類型,無類型層次,避免囉嗦。
語言特性:
清晰,精確的文法文法:大多數從c 繼承, 包機制Pascal/Modula/Oberon family (declarations, packages),並發從(CSP)那裡借鑒。
大寫符號匯出符號。
函數或者塊開始注釋是文檔,用於gdoc處理。
改進的If, case 複合陳述式,允許在條件前,執行語句。 Case 不支援自動fall throught, 必須顯示說明。 Case支援多個判斷。
輕量的類型系統
沒有隱式的轉換
強型別,顯式類型轉化
指標運算 slice代替 提供安全性
通用類型:interface{}
內建數組和字典
支援物件導向編程,但是不支援層次繼承。
融合多種語言的特性,各個社區的人都會熟悉,特別是c, lua, python社區的使用者非常容易上手。
運行期: c和彙編實現記憶體的分配和收集,棧管理,輕量級協程,通訊管道,切片,Map以及反射等等基礎設施。
Gc:目前是用經典的簡單的Mark And sweep 演算法, 未來會採用更高效,低延遲的演算法。
庫實現:
1. 完全用Go語言實現, 不依賴其他系統庫
2. 從介面庫如xml, asn1,jonson, IO庫,壓縮,加密庫等等,比較齊全,極大的方便了使用者。
支援unicode. 值得一提的是 Go的 “hello 世界”,很好的展示了對unicode支援。
模組:
Package管理。一個package可以分散在多個檔案裡,就好比在一個檔案效果一樣。
擴充:
Cgo 支援c和go編程混合,使得GO的擴充非常容易,讓Cgo來做參數和類型的轉換, 直接連接使用者的c函數。
Range:for語句支援通用的迭代,支援數組,字典,通訊管道。 特別是通訊管道結合goroutine, 由生產者負責在一端輸入資料, range充當消費者, 從另外一端。。。,使得包容器的迭代實現非常的優雅和簡單易懂。
Type: 相當靈活的struct, 支援匿名欄位,複用看起來很優雅。
Interface:
介面 類型 介面實現分離。Interface{}用來實現表示同樣類型,用於實現保容器和參數省略。
閉包:函數是第一類對象。有了閉包,我們很容易把資料和函數結合在一起,形成一個獨立的執行體,無需關心資料的泄漏。
反射(reflection):用於實現多參數和實現比如xml庫,很直觀的把結構的欄位名和值對應起來,但是效率不高。
Network 支援。支援tcp,udp,介面統一,但網路讀寫暫時無效的時候,net模組會自動把該控制代碼註冊到系統的poll, 並且讓出執行,等待讀寫事件的發生。一旦事件通知,net內部通過channel通知阻塞的控制代碼繼續往下執行。從使用者的使用角度來看,網路的讀寫都是順序執行的,極大的簡化了編程。
Goroutine:Goroutines 是使得並發編程變得容易的核心。核心思想就是通過系統的線程來多路派遣獨立函數的執行 單位協程。當一個協程阻塞的時候,比如說系統調用,調度器就會自動把其他協程安排到另外的線程去執行,從而保證了系統的不間斷運行。 這個調度對於程式員是透明的,從使用者的角度來看,協程在一直運行。而且這個調度的開銷非常小,典型的CPU每秒鐘可以調度百萬次,使得我們可以建立大量的goroutine, 類比現實世界的行為,大大的簡化了程式的設計和實現。
Channel: CSP的核心思想是通過訊息共用, 而不是記憶體共用。 而訊息共用機制就是通過channel來傳遞訊息,有同步和非同步之分。 Channel在生產者和消費者之間架設起溝通的橋樑。
正是 Network+閉包+Goroutine+Channel讓Go這麼突出。
目前存在的問題:
1. 語言的實現時間比較短,實現和社區都不夠成熟,一些語言特性如select timeout還沒有實現。
2. 語言庫和基於GO的應用還比較少,甚至在Google內部也還是個實驗項目。
看著網上對其的評價很高的,打算研究看看!!群裡幾個技術達人,現在已經開始編碼了,佩服他們的速度和能力!!