Golang之初探

什麼是Go語言

Go語言介紹

產生背景:

超級複雜的C++11特性的吹捧報告的鄙視以及最終的目標是具有動態語言的開發速度的同時並要有C/C++編譯語言的性能與安全性以及設計網絡和多核時代的C語言數據庫


Go語言之父

Go語言最初由Goole公司的Robert Griesemer、Ken Thompson和Rob Pike三個大牛設計發明編程

  1. Robert Griesemer:參與開發 Java HotSpot 虛擬機,對語言設計有深刻的認識,並負責 Chrome 瀏覽器和 Node.js 使用的 Google V8 JavaScript 引擎的代碼生成部分
  2. Ken Thompson:貝爾實驗室 Unix 團隊成員,C 語言、Unix 和 Plan 9 的創始人之一,在 20 世紀 70 年代,設計並實現了最初的 UNIX 操做系統,僅從這一點說,他對計算機科學的貢獻怎麼強調都不過度。他還與 Rob Pike 合做設計了 UTF-8 編碼方案
  3. Rob Pike:Go 語言項目總負責人,貝爾實驗室 Unix 團隊成員,除幫助設計 UTF-8 外,還幫助開發了分佈式多用戶操做系統 Plan 9,Inferno 操做系統和 Limbo 編程語言,並與人合著了《The Unix Programming Environment》,對 UNIX 的設計理念作了正統的闡述


Go的起源

  1. Go起源於2007年,2008年中期,語言的大部分特性設計已經完成,並開始着手實現編譯器和運行時,大約在這一年Russ Cox做爲主力開發者加入。到了2010年,Go語言已經逐步趨於穩定。同年9月,Go語言正式發佈並開源了代碼。
  2. Go語言不少時候被描述爲「類C語言」,或者是「21世紀的C語言」。而且從各類角度看,Go語言確實是從C語言繼承了類似的表達式語法、控制流結構、基礎數據類型、調用參數傳值、指針等諸多編程思想,還有完全繼承和發揚了C語言簡單直接的暴力編程哲學等。下圖是《Go語言聖經》中給出的Go語言的基因圖譜,咱們能夠從中看到有哪些編程語言對Go語言產生了影響。

圖 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是解釋型語言?仍是編譯型語言?

  1. GO語言是編譯型語言,經過使用編譯器將源代碼編譯成二進制文件,在編譯過程當中,由編譯器檢查錯誤、性能優化及編譯到不一樣平臺的二進制文件,
  2. 建立GO語言程序執行步驟以下
    • 建立Go語言程序
    • 保存文件
    • 經過編譯器去編譯程序
    • 經過編譯後,根據本身的需求去生成不一樣平臺的二進制文件
  3. 解釋型語言和編譯型語言的簡單編譯對比

image

 


Go語言吉祥物

Go 語言有一個吉祥物,在會議、文檔頁面和博文中,大多會包含下圖所示的 Go Gopher,這是才華橫溢的插畫家 Renee French 設計的,她也是 Go 設計者之一 Rob Pike 的妻子網絡


世界爲何須要Go語言

 

硬件限制:摩爾定律已然失效

摩爾定律:當價格不變時,集成電路上可容納的元器件的數目,約每隔18-24個月便會增長一倍,性能也將提高一倍。 換言之,每一美圓所能買到的電腦性能,將每隔18-24個月翻一倍以上。數據結構


從上面的圖表能夠看出,近十年單線程性能和處理器頻率保持穩定。咱們不能像以前同樣把添加更多晶體管當成是解決方案,由於在較小規模上一些量子特性開始出現(如隧道效應),而且由於在一樣小的空間裏放置更多晶體管的代價很是昂貴,每1美圓能夠添加的晶體管數量開始降低。併發

製造商開始從其餘方面提升處理器的性能:

  1. 向處理器添加愈來愈多的內核,如四核和八核CPU。
  2. 發明了超線程技術。
  3. 爲處理器添加了更多緩存以提升性能。

但上述解決方案也有其自身的侷限性。由於成本緣由咱們不能無限制的爲計算機添加內核,也沒法無限制的添加緩存來提升性能,由於緩存越大,取值的性能越低。

咱們沒有辦法在硬件上一直取得突破,咱們須要提升軟件的性能或者說咱們須要高性能的軟件。


Go語言天生支持高併發

如上所述,硬件製造商正在爲處理器添加愈來愈多的內核以提升性能。全部數據中心都在這些處理器上運行,更重要的是,今天的應用程序使用多個微服務來維護數據庫鏈接,消息隊列和維護緩存。所以,開發的軟件和編程語言應該能夠輕鬆地支持併發性,而且應該可以隨着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的特色:

  1. goroutine具備可增加的分段堆棧。這意味着它們只在須要時纔會使用更多內存。
  2. goroutine的啓動時間比線程快。
  3. goroutine原生支持利用channel安全地進行通訊。
  4. goroutine共享數據結構時無需使用互斥鎖


Go語言簡單易學、容易上手

語法簡潔

Go語言學習曲線平緩、簡單易學,同時,Go語言被稱爲」21世紀的C語言」。Go語言的編碼風格相似於C語言,其又在C語言的基礎上進行了大幅度簡化

代碼風格統一

Go語言提供了本身的一套格式化工具」go fmt」,一些Go語言的編輯器或者開發環境在保存時,都會自動經過格式化工具進行對代碼格式化,這樣就保證了不一樣開發者提交的代碼具備統一的格式,從而提升了代碼的可讀性

開發效率高

Go語言實現了開發效率和運行效率的完美結合,擁有解釋型語言的開發速度和編譯型語言的運行速度

相關文章
相關標籤/搜索