1. 程式人生 > >Go的2017回顧和2018展望

Go的2017回顧和2018展望

Golang在過去一年取得的重要成績(包括重點專案的成績)

kubernetes已經成為了所有云計算公司的底層架構,而且越來越多的網際網路公司系統架構遷移到k8s上面,例如github、阿里、騰訊、百度、滴滴、京東等大型企業紛紛擁抱,而這個系統就是Go開發的,很多公司都開始大力的投入工程師在Go開發中來,Go一下子就成為了雲端計算的核心語言,大家應該都聽過一個組織叫做CNCF,雲端計算基金會組織,下面孵化了一堆的雲端計算專案,https://www.cncf.io/ 就可以看到基本上90%的專案都是Go語言開發的,從這個我們可以看出來Go已經成為了名副其實的雲端計算系統語言。

Golang最近幾次版本更新要點

最近兩個大版本分別是Go1.9和Go1.10,我就對於這兩個版本里面帶來的幾個新特性大概的介紹一下。

語言層面:

  1. 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 //新增的型別化名

把握住一點:。

效能優化:

  1. 編譯效能

Go 1.10的編譯效能最大的改變在於cache機制的實現。事實證明cache機制的使用,在日常開發過程中會很大程度上提升你的工作效率,越是規模較大的專案越是如此。

   2.目的碼的效能

這些年Go team在不斷優化編譯器生成的目的碼的效能,比如在中引入ssa後端。Go 1.10延續著對目的碼生成的進一步優化,雖說動作遠不如引入ssa這麼大。

   3.GC效能

GC的效能一直是廣大Gopher密切關注的事情,Go 1.10在減少記憶體分配延遲以及GC執行時的負擔兩個方面做了許多工作,但從整體上來看,GC變化不是很大。

標準庫:

  1. 增加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 的國內國外公司都非常之多,我這邊大概的列一下主要的公司

國外公司列表

公司名

產品或網址

Google

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、系統/命令列工具、中介軟體、測試/持續交付、檔案系統等各方面的開源專案。

640?wx_fmt=png

詳細地址: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折優惠!數量有限,先到先得哦〜