這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go Lang介紹
Go程式設計語言是Google中一些大牛(尤其是有著plan9前科的大牛們)如Rob Pike,Ken Thomason這兩位赫赫有名的程式高手、技術作於2007年9月開始建造。
Pike指出,Go代碼的編譯基本上可以達到C語言的速度,幾乎可以在瞬間完成,“就像是在使用互動式語言”。現有的語言都沒有針對多核心處理器進行最佳化,為瞭解決此類編程問題,Google工程師們開發了Go語言。從源檔案的copyright可以看到,很多基礎代碼來自plan9.
Go 已在Google公司自我裝載過,但仍處於實驗階段。Google開放Go的代碼,希望籍此協助Go語言的發展。首席軟體工程師RobPike說:我們開發Go,是因為近10年左右開發程式之難讓我們有點沮喪。Google兩年前開始開發Go,1年前開始有一隻團隊專職於此。目前只支援unix平台, windows平台的支援由於資源的原因,需要更多的參與者來移植。
Go的定位 是系統編程,比如Web伺服器、儲存系統和資料庫等,但也歡迎在其它方面的應用。
Go語言的官方吉祥物如下:
我看好Go的原因是:這個語言不是憑空或者實驗室設計的,而是填補過去10年在系統編程軟體方面的不足。作為系統軟體的編寫者,經常會深深的感覺到目前常見語言的面對大規模的網路應用,在不斷湧現的多核心硬體前的無奈, 糾纏在多線程和各種鎖中間, 不停的製造各種各樣的輪子,低效的排錯。Go擁有的這些現代特性都是系統使用者夢迷以求的,經過作者全面的考慮,適當的取捨,即結合了動態語言的彈性,又有了靜態語言的安全性和高效能。
目前這個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內部也還是個實驗項目。