Go 筆記之為什麼要學 Go
新學一門語言,大家都想先弄清楚為什麼要學它?玩知乎一段時間更是讓我感受深刻,諸如
- 為什麼要學習Python?
- 為什麼要學習C?
- 為什麼要學習Java?
之類問題經常出現在眼前。以前學語言時倒沒怎麼關心過這類問題。今年公司由於新業務需要開始全面從PHP轉型到Golang。所以我學習它也就是為了工資。額?不能這麼俗氣,還是具體想想自己為什麼要學習Golang吧。
作為一名golang新人,在寫這篇文章時我搜羅到不少golang的優秀資料,在文章最後分享出來。
大勢所趨
趨勢如此,這應該是多數朋友開始學習它的原因。追漲殺跌,這是大多數人喜歡的操作手法。
何以證明這個趨勢呢?
首先,我的親生經歷是聽到看到golang這個詞的頻率越來越高,不過,這個太難量化了。來介紹一款工具,google trend,即google趨勢。它是google利用自身優勢,通過對搜尋關鍵詞進行統計分析,根據單詞頻率分析特定時期某類事物發展趨勢的一款分析工具。
我們可以用google趨勢來分析一下近年來golang的發展趨勢,點選連結。
先看看時間線上的表現,歷史的變化趨勢:
可以看出,從2015年到2019年golang的發展趨勢一直處在穩定上升階段;
不過我們會想,這隻能說明golang在世界上整體趨勢表現較好,但在中國是否一樣火熱。這個大可不必擔心,google趨勢中也有區域的統計資訊:
可以看出,Golang在世界區域的分佈情況,前五名分別是,中國、新加坡、聖赫勒拿、韓國、香港。其中,Golang在中國的流行程度簡直就是一騎絕塵、遙遙領先。
注:如果想分析中國各城市的表現情況,可以點選地圖就可進入特定國家進行分析。
除了google趨勢,還可以來看看在TIOBE語言排行榜上的表現。點選連結
額?怎麼才十六名,好緊張、好難過,難道學錯語言了嗎?不對,得找幾個理由安慰下自己。
Golang是一門非常年輕的語言,僅用十年時間就從世界上數以千計的程式語言中脫穎而出,發展速度迅猛。諸如Java、Python、PHP、Javascript都和我一樣處在了奔三的路上,近30載的發展才有當前的生態與地位;
Golang在2018年的最好成績曾到達過前十名,這個成績足以說明golang的流行程度。而且排名存在浮動也是很正常的事情,Golang這些年穩步的發展趨勢還不能給我們足夠的信心嗎?
通過以上的資料分析,我們得到了一些結論,不過感覺說服力不足,有種空喊口號 "我們能贏" 的感覺。趨勢很好,就認為穩贏,顯然這是很不合理的。所以,我們還需要分析一些更層次的原因。
核心成員
為什麼要了解核心成員呢?核心成員某種意義上是語言的招牌。就像投資,肯定選擇相信巴菲特,而不是你。
Golang的核心開發組成員由一群大神級人物組成。其中,最核心的三人分別是Ken Thompson、Rob Pike、Robert Griesemer。
Robert Griesemer,參與開發了 Java HotSpot 虛擬機器和Javascript的Chrome V8引擎;
Ken Thompson,C和B語言的設計者、Unix創始人之一,作業系統Plan 9的主要作者,1983年圖靈獎得主;
Rob Pike,UTF8的主要設計者,與Ken Tompson為貝爾實驗室的同事,共同參與了Plan9。而且Golang的logo,據說是囊地鼠,英文gopher,就是Rob Pike的妻子設計的;
都是如此這般牛人坐鎮,可見golang的層次已經高出其他語言很多個臺階了。
背景歷史
清楚它的產生背景與發展歷史,才能更好了解它的特性與使用場景。
首先,Golang誕生於google。有了大廠庇護,才好開掛。google曾經一直有個傳統,允許員工自由支配本屬於工作時間的20%來用於創新實踐,這為google帶來很多開創性的專案,其中就包括Golang。但聽說,前幾年該傳統已經被取消了。
Golang早起的討論由前面介紹的三位大牛發起,針對性分析了當時的環境背景。
首先,當時傳統的程式語言通常都會有如下一些缺點:
- 學習成本太高,如C++,為準確表達作者思想,我們要花費大量時間學習語言;
- 編譯速度太慢,程式碼的編寫、預處理、編譯與執行流程花費時間太長;
- 缺乏型別檢查,主要指諸如python、php等解釋性語言,這常會導致一些低階錯誤發生;
- 而且計算機領域相比於前些年也發生了很多變化,比如:
- 計算機硬體發展迅速,軟體已經不能充分發揮它們的優勢,比如多CPU;
- 語言越來越複雜,要麼併發與效能不佳,要麼風格不夠優雅且不統一;
- 人力成本越高越貴,專案的迭代週期越來越短;
針對如上的各種情況,於是在2007年,他們正式開始著手Golang的設計與開發,並在2009年的11月正式釋出。我們列舉下,接下來一段時間,Golang發展中幾個關鍵節點。
- 2012年3月,正式釋出1.0版,走向成熟;
- 2015年8月,釋出了1.5版,實現自編譯,移除最後殘餘的 "C程式碼";
更新迭代速度多,基本保持了每半年更新一個版本;
- 2017年2月,釋出1.8版
- 2017年8月,釋出1.9版
- 2018年2月,釋出1.10版
- 2018年8月,釋出1.11版
- 2019年2月,釋出1.12版
如此給力的團隊與穩定的版本迭代速度,某種程度也促成了golang快速發展。
語言特性
各種介紹go的文章講的最多的兩點特性:靜態語言與高併發。但是取交集的話,特性就太少了。介紹細緻些吧,但如此一來,這段就顯得很是無聊,
瞭解golang特性前,可先來看看它的幾個設計原則。在網上搜羅了些資料,總結出大概幾點:
- 大道至簡,比如及其簡單但完備的面向物件設計,面向介面,沒有繼承只有組合;
- 最少特性,一個特性對解決問題有顯著效果就沒有必要存在;
- 顯式表達,比如資料型別必須顯式轉化,不提供隱式轉化能力;
- 最少驚異,減少那些奇怪的特性設計,最大程度減少錯誤發生概率;
從產生背景我們可以知道,Golang在主要針對其他語言痛點而設計的。它有哪些特性?
- 靜態語言、靜態編譯速度快,擁有靜態語言的安全與效能;
- 天然支援併發,基於CPS併發模型,goroutine輕量級執行緒,支援大併發處理;
- 簡潔的指令碼化語法,如變數賦值 a := 1,兼具靜態語言的特性與動態語言的開發效率;
- 提供垃圾回收機制,不需要開發人員管理,通過迴圈判活,再啟用goroutine來清理記憶體;
- 創新的異常處理機制,普通異常通過返回error物件處理,嚴重異常由panic、recover處理;
- 函式多返回值,方便接收多值,一些解釋性語言已經支援,如python、js的es6等;
- 支援defer延遲呼叫,從而提供了一種方式來方便資源清理,降低資源洩露的概率;
- 面向介面的oop,沒有物件與繼承,強調組合,以類似於duck-typing的方式編寫面向物件;
那麼多特性,好無聊,不對,應該是好厲害。之前在知乎上看到過有位朋友寫了個十分鐘GO快速入門的文章,挺有趣的,分享出來。看過之後應該對上面這些特性有更直觀的認知。
知乎地址在 GO十分鐘快速入門,程式碼在 GO Play 程式碼體驗。
優秀專案
已經說了那麼多Golang的牛x之處,但以前出現過的很多語言也都是這麼宣傳的。 語言的目標是用於專案開發,並能打造出很多優秀的產品。那麼,Golang有哪些好像優秀的專案呢?不搜不知道,一搜嚇一跳!列舉一下我收集到的golang開發的優秀專案, 如下:
- docker,golang頭號優秀專案,通過虛擬化技術實現的作業系統與應用的隔離,也稱為容器;
- kubernetes,由google開發,簡稱k8s,k8s和docker是當前容器化技術的重要基礎設施;
- etcd,一種可靠的分散式KV儲存系統,有點類似於zookeeper,可用於快速的雲配置;
- codis,由國人開發提供的一套優秀的redis分散式解決方案;
- tidb,國內PingCAP 團隊開發的一個分散式SQL 資料庫,國內很多網際網路公司在使用;
- influxdb,時序型DB,著力於高效能查詢與儲存時序型資料,常用於系統監控與金融領域;
- cockroachdb,雲原生分散式資料庫,繼NoSQL之後出現的新的概念,稱為NewSQL資料庫;
- beego,國人開發的一款及其輕量級、高可伸縮性和高效能的web應用框架;
- caddy,類比於nginx,一款開源的,支援HTTP/2的 Web 服務端;
- flynn,一款開源的paas平臺;
- consul,HashiCorp公司推出的開源工具,用於實現分散式系統的服務發現與配置;
- go-kit,Golang相關的微服務框架,這類框架還有go-micro、typthon;
- go-ethereum,官方開發的以太坊協議實現;
- couchbase,是一個非關係型資料庫;
- nsq,一款高效能、高可用訊息佇列系統,每天能處理數十億條的訊息;
- packer,一款用來生成不同平臺的映象檔案的工具,例如VM、vbox、AWS等;
- doozer:高速的分散式資料同步服務,類似ZooKeeper;
- tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣;
- gor:一款用Go語言實現的簡單的http流量複製工具;
專案列舉了這麼多,從此也可看出現在很多新專案都在使用Golang開發,涉及到很多領域。
應用領域
接下來了解下Golang具體擅長哪些領域,如果不適合自己所在行業,暫時就沒必要去學習了。
區塊鏈
當前的兩個主流區塊鏈框架,分散式記賬本框架hyperledger和以太坊合約框架go-ethereum都是使用Golang開發;下圖是某招聘網站關於區塊鏈職位要求技能的分析。
微服務
現在越來越多的專案會採用微服務架構,前面介紹的優秀專案中也看到很多go提供的微服務框架,如git-kit、micro等。
舉一些具體公司的例子,比如今日頭條使用Golang構建了千萬級微服務;
雲服務
雲服務,如國內著名的七牛雲全站採用Golang開發;還有如盛大CDN、阿里雲CDN等;
很多的雲平臺基礎設施如docker、kubernetes等為Golang開發;
京東的訊息推送與分散式儲存也是如此;
分散式
諸如資料庫中介軟體、代理服務等很多采用Golang開發,比如前面的介紹codis、cockroachdb、etcd等;
其他
很多領域都能看到Golang的影子,諸如直播領域、遊戲開發等等,在其中golang為後臺的排程系統、任務處理,批量的資料計算、系統監控等提供了各種解決方案。 比如,最近知乎近也使用Golang進行重構了自己的推薦系統。
很多涉及領域就不一一列舉了。反正一句話就是很牛。
學習資料
說這麼多,主要是為給自己好好學習找個藉口。接下來分享一些近期收集的Golang學習資料。
Golang官網
Golang官方地址: golang.org,無論學習什麼知識,第一手資料基本都是首發於官網。進入到官網後,會看到很多資源,比如:
- 文件:golang.org/doc,官方文件,仔細讀下文件首頁並分類,瞭解下自己要學哪些內容;
- 一覽:tour.golang.org,互動式執行環境,不安裝golang便可體驗學習它的語法與使用;
- 指南:golang.org/ref/spec,golang學習指導手冊,從基礎語法到高階特性全部都有介紹;
- 標準庫:golang.org/pkg/,可以檢視所有的官方庫的介面、原始碼以及使用介紹;
- 部落格:blog.golang.org,不定期分享go的最佳實踐,有些公司也會投稿介紹自己的案例;
- 實驗室:play.golang.org,感覺和tour類似,不過在這裡編寫的程式碼可以分享給別人;
等等。
官網是個寶庫,我們需要認真仔細去挖掘其中的內容;但由於一些原因,golang的官方站點我們無法訪問,不過golang為我們提供了中國的官網,地址:golang.google.cn;
golang社群
一門語言的發展需要有大批牛人的分享佈道,也需要我們這些菜鳥學習有更多的參考路徑。這一切都離不開社群。國內外也有很多優秀的go語言社群;
- go語言中文網,studygolang.com,分享Go語言知識,聚合各種golang文章和書籍資料;
- go交流論壇,gocn.vip,go語言學習交流論壇;
- go官方討論組,forum/golang-nuts,golang的官方郵件討論組;
一張圖、一個目錄與一個合集
在整理資料時,發現太多優秀的開源專案與書籍,重複工作就不做了,分享幾個別人整理的優秀資源。如下:
- 一個目錄:索引目錄地址,各種go語言資源的彙總;
- 一張圖譜:圖譜processon地址,源自Golang Foundation;
- 一個合集:awesome-go,其中整理了大量golang的庫、框架和一些