Golang在過去一年取得的重要成績(包括重點項目的成績)
2017年可以說是Go在雲計算取得了領導地位,kubernetes已經成爲了所有云計算公司的底層架構,而且越來越多的互聯網公司系統架構遷移到k8s上面,例如github、阿里、騰訊、百度、滴滴、京東等大型企業紛紛擁抱,而這個系統就是Go開發的,很多公司都開始大力的投入工程師在Go開發中來,Go一下子就成爲了雲計算的核心語言,大家應該都聽過一個組織叫做CNCF,雲計算基金會組織,下面孵化了一堆的雲計算項目,https://www.cncf.io/ 就可以看到基本上90%的項目都是Go語言開發的,從這個我們可以看出來Go已經成爲了名副其實的雲計算系統語言。
同時又是Go在第二領域開始發力的一年,我所說的第二領域就是區塊鏈,大家都知道比特幣在過去一年可以說迅速的火爆全球,而它的底層技術區塊鏈技術也是開始獲得大家的認知,這個可以說是區塊鏈1.0版本應用,而區塊鏈2.0版本應用就是智能合約以太坊開始獲得所有人的認知,基本上目前大多數做區塊鏈的公司都是基於以太坊進行二次開發,而以太坊的底層正是Go開發的,同時IBM也開源了他們的fabric,Fabric是一個分佈式賬本平臺方案,主要用於運行智能合約,利用可靠的技術以及可插拔方式實現各種商業應用場景的模塊化架構,而且這個系統也是Go開發的,這兩個區塊鏈裏面的明星項目都是用Go開發的,足以說明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.9中,在原先的支持包級別的並行編譯的基礎上又實現了包函數級別的並行編譯,以更爲充分地利用多核資源。Go 1.10的編譯性能最大的改變在於cache機制的實現。事實證明cache機制的使用,在日常開發過程中會很大程度上提升你的工作效率,越是規模較大的項目越是如此。
2.目標代碼的性能
這些年Go team在不斷優化編譯器生成的目標代碼的性能,比如在Go 1.7版本中引入ssa後端。Go 1.10延續着對目標代碼生成的進一步優化,雖說動作遠不如引入ssa這麼大。
3.GC性能
GC的性能一直是廣大Gopher密切關注的事情,在Go 1.9中依舊繼續優化和改善,大多數程序使用1.9編譯後都能得到一定程度的性能提升。1.9 中尤其提到了大內存對象分配性能的顯著提升。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有時並不能完全滿足需求,我們時常需要沿着“業務相關”的執行路徑去Profile。Go 1.9在runtime/pprof包、go tool pprof工具增加了對label的支持。Go team成員rakyll有一篇文章“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來寫,多寫就會理解越來越深入.