Go的2017回顧和2018展望
Golang在過去一年取得的重要成績(包括重點專案的成績)
kubernetes已經成為了所有云計算公司的底層架構,而且越來越多的網際網路公司系統架構遷移到k8s上面,例如github、阿里、騰訊、百度、滴滴、京東等大型企業紛紛擁抱,而這個系統就是Go開發的,很多公司都開始大力的投入工程師在Go開發中來,Go一下子就成為了雲端計算的核心語言,大家應該都聽過一個組織叫做CNCF,雲端計算基金會組織,下面孵化了一堆的雲端計算專案,https://www.cncf.io/ 就可以看到基本上90%的專案都是Go語言開發的,從這個我們可以看出來Go已經成為了名副其實的雲端計算系統語言。
Golang最近幾次版本更新要點
最近兩個大版本分別是Go1.9和Go1.10,我就對於這兩個版本里面帶來的幾個新特性大概的介紹一下。
語言層面:
Type alias
我們都知道Go程式碼重構過程中最大的難點就是相容性,而Go裡面我們一旦匯出的變數、函式等如果想要再次重構,那麼就會變得非常困難,這個特性的引入就是為了解決這個問題的,最初由Robert Griesemer提出來這個特性的,計劃在1.8版本加入,但是時間緊迫推遲到了1.9版本才加入。
官方對type alias的定義非常簡單:
An alias declaration binds an identifier to the given type.
我們怎麼來理解新增的type alias和傳統的type definition的區別呢?
type T1 T2 // 傳統的型別定義vs.type T1 = T2 //新增的型別化名
把握住一點:。
效能優化:
編譯效能
Go 1.10的編譯效能最大的改變在於cache機制的實現。事實證明cache機制的使用,在日常開發過程中會很大程度上提升你的工作效率,越是規模較大的專案越是如此。
2.目的碼的效能
這些年Go team在不斷優化編譯器生成的目的碼的效能,比如在中引入ssa後端。Go 1.10延續著對目的碼生成的進一步優化,雖說動作遠不如引入ssa這麼大。
3.GC效能
GC的效能一直是廣大Gopher密切關注的事情,Go 1.10在減少記憶體分配延遲以及GC執行時的負擔兩個方面做了許多工作,但從整體上來看,GC變化不是很大。
標準庫:
增加monotonic clock支援
2017年元旦之夜,史上第27次閏秒出現,正是因為這個閏秒的出現,歐美知名CDN服務商Cloudflare的DNS出現大規模故障,導致歐美很多網站無法正常被訪問。之後,Cloudflare工程師分析了問題原因,罪魁禍首就在於golang time.Now().Sub對時間的度量僅使用了wall clock,而沒有使用monotonic clock,導致返回負值。一般來說,wall clock僅用來告知時間,mnontonic clock才是用來度量時間流逝的。為了從根本上解決問題,Go 1.9在time包中實現了用monotonic clock來度量time流逝,這以後不會出現時間的“負流逝”問題了。這個改動不會影響到目前大家對timer包的方法層面上的使用。
2.增加math/bits包
在一些演算法程式設計中,經常涉及到對bit位的操作。Go 1.9提供了高效能math/bits package應對這個問題。
3.提供了一個支援併發的Map型別
Go原生的map不是goroutine-safe的,儘管在之前的版本中陸續加入了對map併發的檢測和提醒,但gopher一旦需要併發map時,還需要自行去實現。在Go 1.9中,標準庫提供了一個支援併發的Map型別:sync.Map
4.增加strings.Builder
strings包增加一個新的型別:Builder,用於在“拼字串”場景中替代bytes.Buffer,由於使用了一些unsafe包的黑科技,在使用者呼叫Builder.String()返回最終拼成的字串時,避免了一些重複的、不必要的記憶體copy,提升了處理效能,優化了記憶體分配。
5.支援profiler labels
“Profiler labels in go”詳細介紹了profiler labels的用法,可以參考,這裡不贅述了。
哪些公司在重點使用Golang,哪些公司對Golang有興趣?
目前使用Golang 的國內國外公司都非常之多,我這邊大概的列一下主要的公司
國外公司列表
公司名 | 產品或網址 |
Kubernetes,vitess,seesaw | |
Docker | moby |
hyper | hyper |
CoreOS | etcd, rocket |
Prometheus | Prometheus |
grafana | grafana |
國內公司列表
公司名 | 產品或網址 |
積夢智慧 | https://jimeng.io |
七牛 | https://qiniu.com |
滴滴 | |
百度 | |
阿里雲 | |
騰訊雲 | |
UCloud | |
PingCAP | tidb |
更多的公司可以參考這裡:https://github.com/golang/go/wiki/GoUsers
重要的Golang開源專案
目前Go裡面開源的大專案太多了,大家可以參考我們最近做的知識圖譜上面的一些開源專案,包含了雲端計算、devops、區塊鏈、人工智慧、遊戲、儲存引擎、Web、系統/命令列工具、中介軟體、測試/持續交付、檔案系統等各方面的開源專案。
詳細地址:https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0
初學者怎麼入手Golang,推薦一些學習型的專案
我覺得學習一門語言最重要的就是做到三點,第一看基礎知識,第二學習抄程式碼,第三學習寫程式碼
第一點,很多人都覺得上來就動手寫,但是你基礎的東西都沒掌握,怎麼寫呢?欲速則不達,所以基礎的東西還是必須要先掌握好.這裡推薦幾個基礎的入門材料:
https://tour.golang.org/#1
邢星翻譯的 https://github.com/mikespook/Learning-Go-zh-cn
Go byExample https://gobyexample.com/
我覺得你把這幾個基礎掌握之後就可以開始抄襲程式碼了,如果你之前有PHP的開發經驗,那麼也許我寫的這本書對你瞭解golang有幫助, https://github.com/astaxie/build-web-application-with-golang
第二點,我們很多時候開始寫程式碼都是沒什麼思路,也無從下手,但是我們可以模仿別人寫程式碼,上海俗話裡面常說"吃大戶,用大戶,消滅大戶",我們就是"看程式碼,抄程式碼,最後自己寫程式碼".這裡給你幾個入門級別的程式碼看看學習一下:
https://github.com/hoisie/web 很簡單,就是學習他的路由怎麼實現的,如何編寫自己的路由
https://github.com/icub3d/home/這是一個Go+ AngularJS的實現,看看如何做API應用
最後我列一下你可以自己參考去實現的一些功能,我當初培訓我們戰虎班的同學就是用這些來一起學習的.
日誌分析
IP庫分析
管理後臺檢視分析日誌
第三點,自己寫程式碼,這個時候就是已經對golang有了一定的瞭解了,那麼我們就可以開始做自己的專案了,做專案最想就是快速開發,那麼我就推薦你
https://github.com/astaxie/beego 使用beego框架可以很快速的開發你的Web或者API應用
https://www.docker.com/ 使用docker來做虛擬化
https://github.com/nsqio/nsq 學習訊息佇列,學習channel和分散式
https://github.com/coreos/etcd 分散式應用
這個階段就是找各種東西用golang來寫,多寫就會理解越來越深入.
第四屆 Gopher China 大會4月將在上海舉辦,今年也是第一次增加了會前的 培訓 。本屆的大會無論從規模,內容都將有更多值得大家期待的!
相關閱讀:
點選閱讀原文報名2018 Gopher China 大會,最後一波早鳥票!
4月1日起恢復888原價〜
Go 中國粉絲獨家福利優惠碼“GopherChina”
報名輸入可享85折優惠!數量有限,先到先得哦〜