取自:http://www.weixinyidu.com/n_3502636程序員
Go的核心貢獻者數據庫
Go主要有靜態語言、天生併發、內置GC、安全性高、語法簡單、交叉編譯和編譯快速這幾個方面的特性。這些特性決定了Go的三個高富帥特性:運行快、開發快和部署快,而這些特性都是針對Google遇到的一些痛點來設計的。編程
圖1安全
在說痛點以前,咱們先來了解一下Go的做者和主要核心開發者們,圖1是Go的三個做者從左到右分別是:Robert Griesemer, Rob Pike 和 Ken Thompson。Robert在開發Go以前是Google V八、Chubby和HotSpot JVM的主要貢獻者;Rob主要是Unix、UTF-八、plan9的做者;Ken主要是B語言、C語言的做者、Unix之父。服務器
圖2網絡
再來看看其餘核心貢獻者,圖2中Russ Cox也是目前Go的領導者之一,他和Rob Pike一塊兒領導Go;Ian Lance Taylor是GCC的做者之一,目前負責GCC的Go實現;Brad Fitzpatrick以前是Memcache的做者,目前主要是HTTP2的實現做者。你們能夠看到這些做者都是各個領域內的頂尖高手,因此當初我相信一羣牛人作出來的Go也必定夠牛。架構
爲何會設計Go語言?併發
當初他們爲何會有設計一個新語言的衝動呢?讓咱們一塊兒來回顧一下這些歷史,也許不少人對他們當年遇到的問題感同身受。運維
設計Go語言是爲了解決當時Google開發遇到的如下這些問題:編程語言
大量的C++代碼,同時又引入了Java和Python
成千上萬的工程師
數以萬計行的代碼
分佈式的編譯系統
數百萬的服務器
其主要有如下幾個方面的痛點:
編譯慢
失控的依賴
每一個工程師只是用了一個語言裏面的一部分
程序難以維護(可讀性差、文檔不清晰等)
更新的花費愈來愈長
交叉編譯困難
因此,他們當時設計Go的目標是爲了消除各類緩慢和笨重、改進各類低效和擴展性。Go是由那些開發大型系統的人設計的,同時也是爲了這些人服務的;它是爲了解決工程上的問題,不是爲了研究語言設計;它仍是爲了讓咱們的編程變得更溫馨和方便。
可是結合Google當時內部的一些現實狀況,如不少工程師都是C系的,因此新設計的語言必定要易學習,最好是C-like的語言;由於有太多的分佈式系統、太多的開發者,因此新的語言必定要能夠Scale,這個包括開發、工程師、代碼、部署和依賴;20年沒有出新的語言了,因此新設計的語言必須是現代化的(例如內置GC)等狀況,他們以爲要實現這個目標就須要Go成爲一個你們都承認的語言。
最後根據實戰經驗,他們向着目標設計了Go這個語言,其主要的特點有:
沒有繼承的OO
強一致類型
Interface可是不須要顯示申明(Duck Type)
Function 和Method
沒有異常處理(Error is value)
基於首字母的可訪問特性
不用的Import或者變量引發編譯錯誤
完整而卓越的標準庫包
Go發佈以後,不少公司特別是雲計算公司開始用Go重構他們的基礎架構,不少都是直接採用Go進行了開發,最近熱火朝天的Docker就是採用Go開發的。咱們來看看目前爲止採用Go的一些國內外公司,國外的如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司,國內的如阿里雲CDN、百度、小米、七牛、PingCAP、華爲、金山軟件、獵豹移動、餓了麼等公司。
Go主要應用的系統
上面那些基本上就是Go的歷史背景和設計初衷,那麼目前Go主要應用於哪些系統呢?
就我知道的來講,目前Go主要應用在下面這些系統:
服務器編程,之前你若是使用C或者C++作的那些事情,用Go來作很合適,例如處理日誌、數據打包、虛擬機處理、文件系統等。
分佈式系統、數據庫代理器等,例如Etcd。
網絡編程,這一塊目前應用最廣,包括Web應用、API應用、下載應用,並且Go內置的net/http包基本上把咱們日常用到的網絡功能都實現了。
數據庫,前一段時間Google開發的Groupcache,Couchbase的部分組建,Tidb,Cockroachdb,Influxdb等。
雲平臺,目前國外不少雲平臺在採用Go開發,CloudFoundy的部分組建,前VMare的技術總監本身出來搞的Apcera雲平臺。
爲何選擇使用Go語言?
國內不少雲創業公司都會選擇把Go做爲首要語言,例如DaoCloud。爲何會選擇Go呢?與其餘語言的應用相比,它有什麼優勢呢?
一、學習曲線
它包含了類C語法、GC內置和工程工具。這一點很是重要,由於Go語言容易學習,因此一個普通的大學生花一個星期就能寫出來能夠上手的、高性能的應用。在國內你們都追求快,這也是爲何國內Go流行的緣由之一。
二、效率
Go擁有接近C的運行效率和接近PHP的開發效率,這就頗有利的支撐了上面你們追求快速的需求。
三、出身名門、血統純正
之因此說Go出身名門,是由於咱們知道Go語言出自Google公司,這個公司在業界的知名度和實力天然不用多說。Google公司彙集了一批牛人,在各類編程語言稱雄爭霸的局面下推出新的編程語言,天然有它的戰略考慮。並且從Go語言的發展態勢來看,Google對它這個新的寵兒仍是很看重的,Go天然有一個良好的發展前途。咱們看看Go語言的主要創造者,血統純正這點就可見端倪了。
四、自由高效:組合的思想、無侵入式的接口
Go語言能夠說是開發效率和運行效率兩者的完美融合,天生的併發編程支持。Go語言支持當前全部的編程範式,包括過程式編程、面向對象編程以及函數式編程。程序員們能夠各取所需、自由組合、想怎麼玩就怎麼玩。
五、強大的標準庫
這包括互聯網應用、系統編程和網絡編程。Go裏面的標準庫基本上已是很是穩定了,特別是我這裏提到的三個,網絡層、系統層的庫很是實用。
六、部署方便:二進制文件、Copy部署
我相信這一點是不少人選擇Go的最大理由,由於部署太方便了,因此如今也有不少人用Go開發運維程序。
七、簡單的併發
它包含了下降心智的併發和簡易的數據同步,我以爲這是Go最大的特點。之因此寫正確的併發、容錯和可擴展的程序如此之難,是由於咱們用了錯誤的工具和錯誤的抽象,Go能夠說這一塊作的至關簡單。
八、穩定性
Go擁有強大的編譯檢查、嚴格的編碼規範和完整的軟件生命週期工具,具備很強的穩定性,穩定壓倒一切。那麼爲何Go相比於其餘程序會更穩定呢?這是由於Go提供了軟件生命週期(開發、測試、部署、維護等等)的各個環節的工具,如go tool、gofmt、go test。
這裏引用知乎裏一個同窗對Go評論的話:最開始準備上線的時候其實內心挺忐忑,畢竟一旦出現故障,不只黑鍋得本身背,面子也上過不去啊。還好結果蠻漂亮,自上線後沒出現過一次突發性BUG,下降運維難度的同時還減小了機器的負載。我相信這也是大多數人用了Go以後的感言。
那麼目前Go還存在哪些缺點呢?如下是我本身在項目開發中遇到的一些問題:
1.Go的Import包不支持版本,有時候升級容易致使項目不可運行,因此須要本身控制相應的版本信息。比較好的現象是從Go 1.5開始Go對此就有重視了並支持Vendor。
2.Go的goroutine一旦啓動後,不一樣的goroutine之間切換不是受程序控制,runtime調度的時候須要嚴謹的邏輯,否則goroutine休眠,過一段時間邏輯結束了卻忽然冒出來又執行了,這會致使邏輯出錯等狀況。這個目前無解,應該屬於調度器的優化。
3.GC延遲有點大,我開發的日誌系統傷過一次,同時在併發很大的狀況下,處理很大的日誌,GC沒有那麼快,內存回收不給力,後來通過Profile程序改進以後獲得了改善。目前來看,GC已經優化的很是好了,給你們看一下Go1.五、Go1.6的GC先後對比圖。
圖3
圖3是Go1.4升級到Go1.5以後的效果,從300ms到了50ms左右。
圖4
圖4是從Go1.5升級到Go1.6,從40ms到了2ms左右,能夠說目前GC基本上不是Go的問題了。
4.pkg下面的圖片處理庫不少bug,仍是使用成熟產品好,調用這些成熟庫imagemagick的接口比較靠譜。總而言之,從工程的角度上來看,對於大多數後臺應用場景,選擇Golang是極爲明智的選擇。 這樣能夠很輕鬆的兼顧運行性能、開發效率及維護難度這三大讓諸多程序猿欲仙欲死的點。