Go語言的一些使用心得
序
起初一直使用的Python,到了18年下半年由於業務需求而接觸了Golang,從開始學習到現在的快半年裡,也用Golang寫了些程式碼,公司產品和業餘寫的都有,今天就寫點Golang相關的總結或者感想吧。
PS:運維人員學習一兩門開發語言是很重要切明智的,不會開發的運維我認為會逐漸被淘汰的,轉型是遲早的事情。
語法簡單
GO是崇尚極簡主義的,提倡少即是多,GO的特性很少,內部關鍵字也不多,基礎的話一天就可以學完,同時它的語法極為簡單,很容易看懂。
部署方便
GO是一個強型別靜態語言(最初不習慣),直接把程式碼程式設計成可執行檔案,不依賴系統環境,完全可以做到輕鬆的釋出。而且還可以交叉編譯。這點我很喜歡。
標準庫
GO自身帶的標準庫現在已經很全面的了,目前從檔案歸檔、壓縮、資料庫到資料序列化,字元格式化、校驗、網路、同步、系統、加密、編碼、圖形等各個方面應有盡有。在標準庫上可以完成幾乎大部分的需求。重要的是,這些標準庫的質量都非常高,都很健壯。介面也較為簡單,有清晰的文件說明。同時隨著這兩年的發展,GO的第三方庫也多了起來,雖然可能沒有像python那麼多,但是較其發展時間來說,還是非常不錯的。
整合測試框架
寫單元測試不是個容易的工作。需要一些技巧和努力才可以做起來。但是在GO中集成了單元測試框架,只要原始碼檔案以_test.go結尾,就可以直接通過go test執行單元測試。同時還提供了程式碼測試覆蓋率工具,可以很容易實施自動化測試。除此之外,還集成了基準測試框架功能,可以很容易的測量自己寫的函式的執行效率。另外,還有效能剖析器,可以在執行時,測試時剖析程式的瓶頸點,進而可以進行優化。有時測試程式碼寫起來比業務程式碼還要多,但在大型專案中測試是必備的。
程式碼風格
GO的程式碼風格要求一致、簡潔 。一些對於其他語言的編譯器完全忽視的問題,在GO編譯器前就會被認為是編譯錯誤,GO語言很可能是第一個將程式碼風格強制統一的語言。我覺得這點很好,別人寫的程式碼感覺也是自己寫的一樣。毫無疑問GO語言的這種做法簡化了問題。
包管理
GO的原始碼建立在package基礎之上,注意的是GO中是不支援迴圈匯入包的,還有Golang的包管理是一直是為人詬病之處,從golang1.5引入的vendor機制,到準官方工具dep,目前為止還沒一個簡便的解決方案。不過現在go modules隨著golang1.11的釋出而和我們見面了,這是官方提倡的新的包管理,乃至專案管理機制,可以不再需要GOPATH的存在。
垃圾回收
通常C++通過指標引用計數來回收物件,但是這 不能處理迴圈引用 。為了避免引用計數的缺陷,後來出現了標記清除,分代等垃圾回收演算法。GO的垃圾回收官方形容為 非分代 非緊縮 寫屏障 併發標記清理 。標記清理演算法的字面解釋,就是將可達的記憶體塊進行標記 mark
,最後沒有標記的不可達記憶體塊將進行清理 sweep。
介面與結構體
第一次學習interface的時候,我是不習慣的,後來就用順手了。 interface是一種型別,也是很多方法的集合,interface可以通過組合擴充套件為新的interface,struct也可以通過組合擴充套件為新的struct。沒有python那樣的繼承,只有組合。這就是GO語言的繼承和多型。
工作佈局
GO定義了專案的目錄結構,比如bin目錄,pkg目錄以及src目錄。這個和我日常的專案佈局是一致的。專案結構的一標準性,可以很方便的理解別人的程式碼框架結構。
併發
現在不管誰提到GO都不得不提到goroutine和channel,GO 語言的併發通過 goroutine 特性完成。goroutine 類似於執行緒,但是可以根據需要建立多個 goroutine 併發工作。goroutine 是由 GO 語言的執行時排程完成(語言層面實現),而執行緒是由作業系統排程完成。卻不失效能。
GO語言還提供 channel 在多個 goroutine 間進行通訊。goroutine和 channel 是 GO語言秉承的 CSP(Communicating Sequential Process)併發模式的重要實現基礎。
GO標準庫中還提供了sync包,其中有基本的mutex說,還有RMutex這樣的讀寫鎖,還有Once,WaiterGroup等東西。基本滿足日常中對鎖的需求了。併發不可濫用,不然會碰到很多問題。
defer
defer是GO的函式延遲呼叫,使用中用得好會很方便,用的不好會碰到很多坑,我一般用於檔案關閉,db連線關閉,一些延遲處理工作。
panic
萬惡的panic,碰到這個有時候不好找原因, 而且會影響全域性,沒有捕獲panic異常的話程式就掛了。
泛型
GO的泛型官方說是在2.0推出,現在看來還遙遙無期呀,要麼就用interface{}來做執行時泛型,要不就自己實現。
一句話: 等吧。
總結
GO裡面其他一些內建的資料結構,比如slice,map等,這些就不講了。
學習一門語言,不要不看不動,最好是學完就找實戰練手。
GO的特性也有很多,我覺得一下子不要全部看的很重要,其中很多都可以在工程中實踐,和語言本身沒有太大關係。
總結下來,這東西就是一個工程工具,各種好用,但是從設計角度講各種粗糙,沒必要過度高估。它算的上工程實踐中的好朋友。在寫服務端,分散式,雲原生系統時它是把利器,在web方向也很不錯。
文章推薦
《Go在谷歌:以軟體工程為目的的語言設計》
Kubernetes系列之理解K8s Service的幾種模式
歡迎您關注程式設計師同行者訂閱號,程式設計師同行者是一個技術分享平臺,主要是運維自動化開發:linux、python、django、saltstack、redis、golang、docker、kubernetes、vue等經驗分享及經驗交流。
趁現在,關注我們

image
牛人並不可怕,可怕的是牛人比我們還努力!
如果您覺得不錯,請別忘了轉發、分享、點贊讓更多的人去學習, 您的舉手之勞,就是對小編最好的支援,非常感謝!

image