2016-07-07最新修改,,添加GC演變說明,。 我在2011年就聽說了Go并學習了一段時間,坦白的說,,那時候對Go是比較無感的,,因為并 沒有看到Go特別亮眼的地方,可能和我使用C,、Erlang,、Java有關,這三種語言可以寫高性能,、高 并發(fā),、高可用的服務;包含了面向過程,、面向并發(fā),、面向對象的思想,我覺得我并不需要再學習 Go,,何況那個時候好像也沒宣傳的那么優(yōu)秀,。 一切都發(fā)生在418天前,因為工作的需要,,我開始寫Go了,,本來預期是一段壓抑、蛋疼的 旅程(被迫使用其它語言的同學可能都會有此感受),,結果收獲了非一般的驚喜,、非一般的效率、 非一般的開發(fā)體驗,。
先用幾個詞來總結一下我的感受:簡潔,、標準、組合,、創(chuàng)造力,、生產力! 特別是生產力,由于Go優(yōu)秀的標準庫,、完美的代碼安全,、全面的三方庫、完善的測試機 制,、完善的標準管理工具,,使用Go給我們小組帶來了極大的生產力。 總之,,在使用過的語言中,,除了Erlang外,我還沒在其它語言上感受過如此之高的生產 力(可能筆者的見識比較狹隘,,請輕噴,;) )。 最近思考了很多,,也橫向對比了一些,,Go 具有高生產力的原因如下: 1.不一定需要IDE 我主要使用的開發(fā)工具一個是liteIDE,另外一個就是Vim,,特別是在自己實驗一些好 的想法時,,Vim用的更多。Go開發(fā)時的簡潔和對其它第三方組件無依賴性,,決定了Go可以在任 何地方寫,,任何地方運行。曾經我嘗試過用Vim去寫Java,,結果無奈的放棄了這個想法,。對于很 多環(huán)境下來說,,不依賴IDE是很重要的,。 2.極快的編譯構建速度 以前編譯C++,Erlang程序,,離開座位去喝杯茶,,吹吹牛是很正常的事。但是自從用 了Go,這種閑逛行為貌似變得更像是在打醬油,,因為一個完整的項目最多僅僅需要數(shù)秒到數(shù)十秒?。?/span> 這個對于初接觸Go的同學來說,,很神奇,;這個對于提高程序員和項目組的生產力來說,很重要,! 3.極其優(yōu)秀的標準庫 使用Go的標準庫也是非常享受的,。從標準庫的設計就能看得出,創(chuàng)建Go語言的那幾位圖 靈獎大神,不僅僅有異常深厚的理論儲備,,還有著非常豐富,、非常廣泛的生產實踐經驗,因為Go 語言解決了很多真實系統(tǒng)設計中,,常常會遇到的問題,。例如,可以非常簡單的使用http服務,、為 socket設置讀寫超時,、統(tǒng)計服務器信息、單元測試壓力測試,、多樣化的性能測試等等,,所有的這些 讓寫出高可用、高性能的服務簡單了數(shù)倍,! 4.多樣化的內置數(shù)據(jù)結構 Map是我使用非常多的數(shù)據(jù)結構-大概10-20%的代碼都使用了Map,。因此作為一個靜態(tài) 語言,Go把Map內置為標準的數(shù)據(jù)類型,,是非常棒的,,大大簡化了使用步驟,提升了性能,。 Go語言中的動態(tài)數(shù)組-slice,,對于實際使用中也是非常關鍵的,配合內置函數(shù)append 和range,,slice的使用靈活度令人難以置信,。 通過這些內置數(shù)據(jù)結構和內置函數(shù),Go程序員在處理各種數(shù)據(jù)結構時就掌握了既標準 又強大的武器,,也是Go語言之所以簡潔的原因之一,。 5.統(tǒng)一的代碼格式規(guī)范 不知道大家有沒有做過項目總結,根據(jù)我多年的經驗,,項目中有一些最浪費時間的地方,, 其中一個地方就是代碼格式問題。在各大論壇,、各大語言板塊都充斥著括號位置,、空格、縮進的 討論,,這些討論在Go語言中都可以打住了,。go fmt可以自動幫我們處理好這些問題,讓我們的每 個源碼文件的代碼格式都是統(tǒng)一規(guī)范的,。在實際應用中,,這個特性可以大大提高團隊的開發(fā)效率: 最簡單的,,寫代碼時,你再也不用在=兩邊,,函數(shù)參數(shù)的后面等地方加上空格了,,只要輸入 go fmt myProject,一切問題都煙消云散,。 6.只有一個的二進制可執(zhí)行文件 使用過Go語言的同學,,應該都知道程序編譯后僅僅生成一個可執(zhí)行的二進制文件,非常 方便,,但是我仍然認為我們大大低估了這個語言特性的好處,,特別是在項目的后續(xù)開發(fā)、維護過程 中?,F(xiàn)在社會,,網絡帶寬和存儲設備都不再昂貴,但是部署,、配置,、管理、升級各種軟件服務的 代價還是較為高昂的,。如果大家自己管理過多個系統(tǒng),、集群,就會知道:升級或安裝依賴庫,、JDK等 組件時,,總會碰到特別痛苦的時候,幾天的加班加點搞定一個問題都有可能,!而純Go寫的程序則不 一樣,,不管項目處于在哪個階段,我們需要的也僅僅是一個binary文件,,對于提高生產力來說,,這個 無疑是非常巨大的。 7.完善的標準測試框架 Go的測試框架是非常棒的,,和其它語言不同的是:我們僅僅使用Go語言自帶的標準化測試 框架,,就可以很好實現(xiàn)各種測試功能:單元,,黑盒,,白盒,壓力測試等等,。除了標準測試外,,還有很 多第三方的優(yōu)秀測試框架,但是要記住的是:最好只使用一套測試框架,,這樣能保持項目的完整性和 一致性,。就筆者的經驗來看,,目前的標準測試框架足夠用了,如果需要單步斷點可以看這里,。 8.性能分析 Go語言自帶標準的性能分析工具,,包括CPU、內存,、阻塞操作(http請求,,數(shù)據(jù)庫請求, time.Sleep等)在內的都可以測量,,influxdb就是利用這些工具實現(xiàn)了數(shù)據(jù)庫的常量時間訪問,。
9.那么對于網上常常被噴的那些所謂的Go的‘問題’呢? 1)GC Go語言從1.3開始,,GC的改進就在持續(xù)進行中,,1.5中,GC改成三色mark and sweep后,,性能得到了極大的提高,,在1.6中,對于內存占用很高,、對象很多的系統(tǒng)又進行了一 次大優(yōu)化,,可以說,現(xiàn)在的Go程序一般不存在GC問題,,除非:分布式緩存,、數(shù)據(jù)庫、消息推送 這樣海量對象的場景,,這時候需要自己做好可復用對象管理,、合并部分小對象、將一些小型的struct 結構定義為值類型而不是指針類型,、還可以從業(yè)務層面和架構層面進行優(yōu)化設計等等,。 不過,雖然說不太需要擔心GC問題,,但是大家還是最好學習一下Go的GC原理和 內存管理,,理解底層原理對于很多時候快速的定位解決問題是大有裨益的。 PS: 2016年7月7日補充,,昨天看到一個使用GO作為核心語言的國外大型視頻直播 網站分享了關于GC的演變史,,直接說結果吧:1.2版本的時候,GC STW時間是2秒左右,,到了1.6版本 再結合一些GC參數(shù)調優(yōu),,達到了30-50ms的級別,目前的1.7版本由于將一些STW工作放到了并發(fā)去 執(zhí)行,,因此GC時間到了1m級別,,整整上千倍的提升,,基本上延時已經不是問題了。后續(xù)版本將進一步 改進STW問題,,同時大大改善GC的吞吐率,。 2)泛型 其實剛從其它語言過來時,我或多或少會在寫Go代碼時用到模版的思想,,但是后 面發(fā)現(xiàn),,這樣會讓代碼更難維護,因此,,寫Go代碼就要用Go的哲學和思想,。 寫過C++代碼的都知道:抽象是一把雙刃劍,過度的抽象就可能存在潛在的問題,。 在我看來,,Go所具有的OO思想,是簡潔的,,是純粹的,,是組合的核心思想。 編程現(xiàn)在就是化繁為簡,,充分利用組合的思想(也是Unix程序設計提倡的思想),,可 以讓我們的開發(fā)模型和項目代碼大大簡化、返璞歸真 ,。Go的OO思想充分體現(xiàn)了三位大神作者的 編程和設計功底,,估計也只有Unix的作者才能寫出這么完美的OO實現(xiàn)了! 3)GOPATH 對于新手來說,,GOPATH很難理解清楚,,我當時剛接觸時,也是迷糊了一段時間,。 現(xiàn)在則是混合了兩種方式,,第一種,在默認的GOPATH下的src中存放項目,;第二種,,自定義一個 臨時的GOPATH,然后存放項目,。后者的獨立性更好,,但是全局使用go build ,go test等命令時就 會有問題,比如手動導出 GOPATH才行: mkdir sunface cd sunface-bench/export GOPATH=$PWDgo get -v github.com/otoolep/bleve-benchgo install github.com/otoolep/bleve-bench/cmd/bench/.$GOPATH/bin/bench -h 10.Go語言的總結Go從出身來看更像學院派語言,,但是實際上它是徹頭徹尾的工程語言,,特別是它很適合 我們團隊,很適合基礎架構,、中間件,、云計算平臺、PasS平臺的開發(fā),,因為說它是云時代的未來第 一語言,,絲毫不為過。 就我這邊的項目而言,,分布式日志平臺,、搜索系統(tǒng)、消息推送等項目中,,避免了JVM或者 EVM的麻煩,,實在是太美好了,所以,,如果條件允許,,我會完全選擇純Go來設計實現(xiàn)一個系統(tǒng),也 許這種美妙只有真正深入用過的人才能體會 ;)
11.廣告時間 歡迎大家加入Golang隱修會,QQ群894864,,網站corego.org(還在制作中),,歡迎加入這個大 家庭,這里有所有你想要的,,而且熱心大神很多哦,! |
|