【轉載】使用Golang工做400天后的感覺

【轉載】使用Golang工做400天后的感覺

轉載: https://blog.csdn.net/kwame211/article/details/79267088git

我在2011年就據說了Go並學習了一段時間,坦白的說,那時候對Go是比較無感的,由於並無看到Go特別亮眼的地方,可能和我使用C、Erlang、Java有關,這三種語言能夠寫高性能、高併發、高可用的服務;包含了面向過程、面向併發、面向對象的思想,我以爲我並不須要再學習Go,況且那個時候好像也沒宣傳的那麼優秀。程序員

一切都發生在418天前,由於工做的須要,我開始寫Go了,原本預期是一段壓抑的旅程(被迫使用其它語言的同窗可能都會有此感覺),結果收穫了非通常的驚喜、非通常的效率、非通常的開發體驗。github

先用幾個詞來總結一下個人感覺:簡潔、標準、組合、創造力、生產力!數據庫

特別是生產力,因爲Go優秀的標準庫、完美的代碼安全、全面的三方庫、完善的測試機制、完善的標準管理工具,使用Go給咱們小組帶來了極大的生產力。編程

總之,在使用過的語言中,除了Erlang外,我還沒在其它語言上感覺過如此之高的生產力(可能筆者的見識比較狹隘,請輕噴;) )。 最近思考了不少,也橫向對比了一些,Go具備高生產力的緣由以下:數組

  • 不必定須要IDE

我主要使用的開發工具一個是liteIDE,另一個就是Vim,特別是在本身實驗一些好的想法時,Vim用的更多。Go開發時的簡潔和對其它第三方組件無依賴性,決定了Go能夠在任何地方寫,任何地方運行。曾經我嘗試過用Vim去寫Java,結果無奈的放棄了這個想法。對於不少環境下來講,不依賴IDE是很重要的。緩存

  • 極快的編譯構建速度

之前編譯C++,Erlang程序,離開座位去喝杯茶,吹吹牛是很正常的事。可是自從用了Go,這種閒逛行爲貌似變得更像是在打醬油,由於一個完整的項目最多僅僅須要數秒到數十秒!!這個對於初接觸Go的同窗來講,很神奇;這個對於提升程序員和項目組的生產力來講,很重要!安全

  • 極其優秀的標準庫

使用Go的標準庫也是很是享受的。從標準庫的設計就能看得出,建立Go語言的那幾位圖靈獎大神,不只僅有異常深厚的理論儲備,還有着很是豐富、很是普遍的生產實踐經驗,由於Go語言解決了不少真實系統設計中,經常會遇到的問題。例如,能夠很是簡單的使用http服務、爲socket設置讀寫超時、統計服務器信息、單元測試壓力測試、多樣化的性能測試等等,全部的這些讓寫出高可用、高性能的服務簡單了數倍!服務器

  • 多樣化的內置數據結構

Map是我使用很是多的數據結構,大概10-20%的代碼都使用了Map。所以做爲一個靜態語言,Go把Map內置爲標準的數據類型,是很是棒的,大大簡化了使用步驟,提高了性能。Go語言中的動態數組slice,對於實際使用中也是很是關鍵的,配合內置函數append和range,slice的使用靈活度使人難以置信。經過這些內置數據結構和內置函數,Go程序員在處理各類數據結構時就掌握了既標準又強大的武器,也是Go語言之因此簡潔的緣由之一。網絡

  • 統一的代碼格式規範

不知道你們有沒有作過項目總結,根據我多年的經驗,項目中有一些最浪費時間的地方,其中一個地方就是代碼格式問題。在各大論壇、各大語言板塊都充斥着括號位置、空格、縮進的討論,這些討論在Go語言中均可以打住了。go fmt能夠自動幫咱們處理好這些問題,讓咱們的每一個源碼文件的代碼格式都是統一規範的。在實際應用中,這個特性能夠大大提升團隊的開發效率:
最簡單的,寫代碼時,你不再用在=兩邊,函數參數的後面等地方加上空格了,只要輸入go fmt myProject,一切問題都煙消雲散。

  • 只有一個的二進制可執行文件

使用過Go語言的同窗,應該都知道程序編譯後僅僅生成一個可執行的二進制文件,很是方便,可是我仍然認爲咱們大大低估了這個語言特性的好處,特別是在項目的後續開發、維護過程當中。如今社會,網絡帶寬和存儲設備都再也不昂貴,可是部署、配置、管理、升級各類軟件服務的代價仍是較爲高昂的。若是你們本身管理過多個系統、集羣,就會知道:升級或安裝依賴庫、JDK等組件時,總會碰到特別痛苦的時候,幾天的加班加點搞定一個問題都有可能!而純Go寫的程序則不
同樣,無論項目處於在哪一個階段,咱們須要的也僅僅是一個binary文件,對於提升生產力來講,這個無疑是很是巨大的。

  • 完善的標準測試框架

Go的測試框架是很是棒的,和其它語言不一樣的是:咱們僅僅使用Go語言自帶的標準化測試框架,就能夠很好實現各類測試功能:單元,黑盒,白盒,壓力測試等等。除了標準測試外,還有不少第三方的優秀測試框架,可是要記住的是:最好只使用一套測試框架,這樣能保持項目的完整性和一致性。就筆者的經驗來看,目前的標準測試框架足夠用了,若是須要單步斷點能夠看這裏。

  • 性能分析

Go語言自帶標準的性能分析Tools,包括CPU、內存、阻塞操做(http請求,數據庫請求,time.Sleep等)在內的均可以測量,influxdb就是利用這些工具實現了數據庫的常量時間訪問。

Golang的問題

那麼對於網上經常被噴的那些所謂的Go的"問題"呢?

1)GC

Go語言從1.3開始,GC的改進就在持續進行中,1.5中,GC改爲三色mark and sweep後,性能獲得了極大的提升,在1.6中,對於內存佔用很高、對象不少的系統又進行了一次大優化,能夠說,如今的Go程序通常不存在GC問題,除非:分佈式緩存、數據庫、消息推送這樣海量對象的場景,這時候須要本身作好可複用對象管理、合併部分小對象、將一些小型的struct結構定義爲值類型而不是指針類型、還能夠從業務層面和架構層面進行優化設計等等。

不過,雖說不太須要擔憂GC問題,可是你們仍是最好學習一下Go的GC原理和內存管理,理解底層原理對於不少時候快速的定位解決問題是大有裨益的。

PS: 2016年7月7日補充,昨天看到一個使用GO做爲核心語言的國外大型視頻直播網站分享了關於GC的演變史,直接說結果吧:1.2版本的時候,GC STW時間是2秒左右,到了1.6版本再結合一些GC參數調優,達到了30-50ms的級別,目前的1.7版本因爲將一些STW工做放到了併發去執行,所以GC時間到了1m級別,整整上千倍的提高,基本上延時已經不是問題了。後續版本將進一步改進STW問題,同時大大改善GC的吞吐率。

2)泛型

其實剛從其它語言過來時,我或多或少會在寫Go代碼時用到模版的思想,可是後面發現,這樣會讓代碼更難維護,所以,寫Go代碼就要用Go的哲學和思想。寫過C++代碼的都知道:抽象是一把雙刃劍,過分的抽象就可能存在潛在的問題。

在我看來,Go所具備的OO思想,是簡潔的,是純粹的,是組合的核心思想。編程如今就是化繁爲簡,充分利用組合的思想(也是Unix程序設計提倡的思想),可讓咱們的開發模型和項目代碼大大簡化、返璞歸真 。Go的OO思想充分體現了三位大神做者的編程和設計功底,估計也只有Unix的做者才能寫出這麼完美的OO實現了!

3)GOPATH

對於新手來講,GOPATH很難理解清楚,我當時剛接觸時,也是迷糊了一段時間。
如今則是混合了兩種方式,第一種,在默認的GOPATH下的src中存放項目;第二種,自定義一個臨時的GOPATH,而後存放項目。後者的獨立性更好,可是全局使用go build ,go test等命令時就會有問題,好比手動導出GOPATH才行:

mkdir sunface 
cd sunface-bench/
export GOPATH=$PWD
go get -v github.com/otoolep/bleve-bench
go install github.com/otoolep/bleve-bench/cmd/bench/.
$GOPATH/bin/bench -h
Go語言的總結

Go從出身來看更像學院派語言,可是實際上它是徹頭徹尾的工程語言,特別是它很適合咱們團隊,很適合基礎架構、中間件、雲計算平臺、PasS平臺的開發,由於說它是雲時代的將來第一語言,絲絕不爲過。

就我這邊的項目而言,分佈式日誌平臺、搜索系統、消息推送等項目中,避免了JVM或者EVM的麻煩,實在是太美好了,因此,若是條件容許,我會徹底選擇純Go來設計實現一個系統,也許這種美妙只有真正深刻用過的人才能體會。

相關文章
相關標籤/搜索