超級複雜的C++11特性的吹捧報告的鄙視以及最終的目標是具有動態語言的開發速度的同時並要有C/C++編譯語言的性能與安全性以及設計網絡和多核時代的C語言數據庫
Go語言最初由Goole公司的Robert Griesemer、Ken Thompson和Rob Pike三個大牛設計發明編程
圖 1-1 Go語言基因族譜數組
首先看基因圖譜的左邊一支。能夠明確看出Go語言的併發特性是由貝爾實驗室的Hoare於1978年發佈的CSP理論演化而來。其後,CSP併發模型在Squeak/NewSqueak和Alef等編程語言中逐步完善並走向實際應用,最終這些設計經驗被消化並吸取到了Go語言中。業界比較熟悉的Erlang編程語言的併發編程模型也是CSP理論的另外一種實現。瀏覽器
再看基因圖譜的中間一支。中間一支主要包含了Go語言中面向對象和包特性的演化歷程。Go語言中包和接口以及面向對象等特性則繼承自Niklaus Wirth所設計的Pascal語言以及其後所衍生的相關編程語言。其中包的概念、包的導入和聲明等語法主要來自於Modula-2編程語言,面向對象特性所提供的方法的聲明語法等則來自於Oberon編程語言。最終Go語言演化出了本身特有的支持鴨子面向對象模型的隱式接口等諸多特性。緩存
最後是基因圖譜的右邊一支,這是對C語言的致敬。Go語言是對C語言最完全的一次揚棄,不只僅是語法和C語言有着不少差別,最重要的是捨棄了C語言中靈活可是危險的指針運算。並且,Go語言還從新設計了C語言中部分不太合理運算符的優先級,並在不少細微的地方都作了必要的打磨和改變。固然,C語言中少便是多、簡單直接的暴力編程哲學則被Go語言更完全地發揚光大了(Go語言竟然只有25個關鍵字,sepc語言規範還不到50頁))。安全
Go語言其它的一些特性零散地來自於其餘一些編程語言;好比iota語法是從APL語言借鑑,詞法做用域與嵌套函數等特性來自於Scheme語言(和其餘不少編程語言)。Go語言中也有不少本身發明創新的設計。好比Go語言的切片爲輕量級動態數組提供了有效的隨機存取的性能,這可能會讓人聯想到鏈表的底層的共享機制。還有Go語言新發明的defer語句(Ken發明)也是神來之筆。性能優化
Go 語言有一個吉祥物,在會議、文檔頁面和博文中,大多會包含下圖所示的 Go Gopher,這是才華橫溢的插畫家 Renee French 設計的,她也是 Go 設計者之一 Rob Pike 的妻子網絡
摩爾定律:當價格不變時,集成電路上可容納的元器件的數目,約每隔18-24個月便會增長一倍,性能也將提高一倍。 換言之,每一美圓所能買到的電腦性能,將每隔18-24個月翻一倍以上。數據結構
從上面的圖表能夠看出,近十年單線程性能和處理器頻率保持穩定。咱們不能像以前同樣把添加更多晶體管當成是解決方案,由於在較小規模上一些量子特性開始出現(如隧道效應),而且由於在一樣小的空間裏放置更多晶體管的代價很是昂貴,每1美圓能夠添加的晶體管數量開始降低。併發
製造商開始從其餘方面提升處理器的性能:
但上述解決方案也有其自身的侷限性。由於成本緣由咱們不能無限制的爲計算機添加內核,也沒法無限制的添加緩存來提升性能,由於緩存越大,取值的性能越低。
咱們沒有辦法在硬件上一直取得突破,咱們須要提升軟件的性能或者說咱們須要高性能的軟件。
如上所述,硬件製造商正在爲處理器添加愈來愈多的內核以提升性能。全部數據中心都在這些處理器上運行,更重要的是,今天的應用程序使用多個微服務來維護數據庫鏈接,消息隊列和維護緩存。所以,開發的軟件和編程語言應該能夠輕鬆地支持併發性,而且應該可以隨着CPU核心數量的增長而可擴展。
可是,大多數現代編程語言(如Java,Python等)都來自90年代的單線程環境。雖然一些編程語言的框架在不斷地提升多核資源使用效率,例如 Java 的 Netty 等,但仍然須要開發人員花費大量的時間和精力搞懂這些框架的運行原理後才能熟練掌握。
Go於2009年發佈,當時多核處理器已經上市。Go語言在多核併發上擁有原生的設計優點,Go語言從底層原生支持併發,無須第三方庫、開發者的編程技巧和開發經驗。
不少公司,特別是中國的互聯網公司,即將或者已經完成了使用 Go 語言改造舊系統的過程。通過 Go 語言重構的系統能使用更少的硬件資源得到更高的併發和I/O吞吐表現。充分挖掘硬件設備的潛力也知足當前精細化運營的市場大環境。
Go語言的併發是基於 goroutine
的,goroutine
相似於線程,但並不是線程。能夠將 goroutine
理解爲一種虛擬線程。Go 語言運行時會參與調度 goroutine
,並將 goroutine
合理地分配到每一個 CPU 中,最大限度地使用CPU性能。開啓一個goroutine
的消耗很是小(大約2KB的內存),你能夠輕鬆建立數百萬個goroutine
。
goroutine
的特色:
goroutine
具備可增加的分段堆棧。這意味着它們只在須要時纔會使用更多內存。goroutine
的啓動時間比線程快。goroutine
原生支持利用channel安全地進行通訊。goroutine
共享數據結構時無需使用互斥鎖Go語言學習曲線平緩、簡單易學,同時,Go語言被稱爲」21世紀的C語言」。Go語言的編碼風格相似於C語言,其又在C語言的基礎上進行了大幅度簡化
Go語言提供了本身的一套格式化工具」go fmt」,一些Go語言的編輯器或者開發環境在保存時,都會自動經過格式化工具進行對代碼格式化,這樣就保證了不一樣開發者提交的代碼具備統一的格式,從而提升了代碼的可讀性
Go語言實現了開發效率和運行效率的完美結合,擁有解釋型語言的開發速度和編譯型語言的運行速度