GO筆記之爲何要學習GO

新學一門語言,你們都想先弄清楚爲何要學它?玩知乎一段時間更是讓我感覺深入,諸如php

  • 爲何要學習Python?
  • 爲何要學習C?
  • 爲何要學習Java?

之類問題常常出如今眼前。之前學語言時倒沒怎麼關心過這類問題。今年公司因爲新業務須要開始全面從PHP轉型到Golang。因此我學習它也就是爲了工資。額?不能這麼俗氣,仍是具體想一想本身爲何要學習Golang吧。python

做爲一名golang新人,在寫這篇文章時我搜羅到很多golang的優秀資料,在文章最後分享出來。nginx

大勢所趨

趨勢如此,這應該是多數朋友開始學習它的緣由。追漲殺跌,這是大多數人喜歡的操做手法。git

何以證實這個趨勢呢?es6

首先,個人親生經歷是聽到看到golang這個詞的頻率愈來愈高,不過,這個太難量化了。來介紹一款工具,google trend,即google趨勢。它是google利用自身優點,經過對搜索關鍵詞進行統計分析,根據單詞頻率分析特定時期某類事物發展趨勢的一款分析工具。github

咱們能夠用google趨勢來分析一下近年來golang的發展趨勢,點擊連接。golang

先看看時間線上的表現,歷史的變化趨勢:web

歷史趨勢

能夠看出,從2015年到2019年golang的發展趨勢一直處在穩定上升階段;redis

不過咱們會想,這隻能說明golang在世界上總體趨勢表現較好,但在中國是否同樣火熱。這個大可沒必要擔憂,google趨勢中也有區域的統計信息:docker

能夠看出,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進行重構了本身的推薦系統。

捨棄 Python,爲何知乎選用 Go 重構推薦系統?

不少涉及領域就不一一列舉了。反正一句話就是很牛。

學習資料

說這麼多,主要是爲給本身好好學習找個藉口。接下來分享一些近期收集的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的官方郵件討論組;

一張圖、一個目錄與一個合集

在整理資料時,發現太多優秀的開源項目與書籍,重複工做就不作了,分享幾個別人整理的優秀資源。以下:

相關文章
相關標籤/搜索