當前位置:
首頁 > 科技 > 初學者入門 Golang 的學習型項目

初學者入門 Golang 的學習型項目

作者 | asta

1

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 工程師。

2

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 機制的使用,在日常開發過程中會很大程度上提升你的工作效率,越是規模較大的項目越是如此。

目標代碼的性能

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

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 包的方法層面上的使用。

增加 math/bits 包

在一些演算法編程中,經常涉及到對 bit 位的操作。Go 1.9 提供了高性能 math/bits package 應對這個問題。

提供了一個支持並發的 Map 類型

Go 原生的 map 不是 goroutine-safe 的,儘管在之前的版本中陸續加入了對 map 並發的檢測和提醒,但 gopher 一旦需要並發 map 時,還需要自行去實現。在 Go 1.9 中,標準庫提供了一個支持並發的 Map 類型:sync.Map

增加 strings.Builder

strings 包增加一個新的類型:Builder,用於在「拼字元串」場景中替代 bytes.Buffer,由於使用了一些 unsafe 包的黑科技,在用戶調用 Builder.String() 返回最終拼成的字元串時,避免了一些重複的、不必要的內存 copy,提升了處理性能,優化了內存分配。

支持 profiler labels

通用的 profiler 有時並不能完全滿足需求,我們時常需要沿著「業務相關」的執行路徑去 Profile。Go 1.9 在 runtime/pprof 包、go tool pprof 工具增加了對 label 的支持。Go team 成員 rakyll 有一篇文章「Profiler labels in go」詳細介紹了 profiler labels 的用法,可以參考,這裡不贅述了。

3

哪些公司在重點使用 Golang?

目前使用 Golang 的國內國外公司都非常之多,我這邊大概的列一下主要的公司

國外公司列表

國內公司列表

更多的公司可以參考這裡:https://github.com/golang/go/wiki/GoUsers

4

重要的 Golang 開源項目

目前 Go 裡面開源的大項目太多了,大家可以參考我們最近做的知識圖譜上面的一些開源項目,包含了雲計算、devops、區塊鏈、人工智慧、遊戲、存儲引擎、Web、系統 / 命令行工具、中間件、測試 / 持續交付、文件系統等各方面的開源項目。

詳細地址:https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0

5

初學者怎麼入手 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 來寫,多寫就會理解越來越深入。

6

福利!福利!

第四屆 Gopher China 大會 4 月將在上海舉辦,今年第一次增加了會前的 Workshop 。本屆大會從規模到內容將創歷史新高,並繼續贈送 GoPher 限量 T 恤。動心了,快戳省錢秘籍:

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 InfoQ 的精彩文章:

程序員究竟要不要學產品知識?
互聯網30年,聊聊這中間那些有意思的公司

TAG:InfoQ |