這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Golang使用感受
說白了一門語言對你造成重大影響的就四個東西:效能,行數,易理解度,坑的多寡深淺(包括網上的相關資料和第三方類庫)。
效能方面
Go 的效能基本上只輸 C 家族,最壞情況也就慢幾倍(不像某些流行語言慢幾十上百倍),就算用來實現對效能要求苛刻的演算法也算不上浪費 CPU。但如果看廣義的效能,把並發算進去,還是比較爽的。像 Ruby / Python 這類被 GIL 束縛手腳的語言就不說了,而相比那些直接作業系統級線程/進程的語言來說,速度優勢就很明顯。當然,很多語言也可以包一個輕量級線程的實現,但問題就出在這裡,他們官方沒做這個事情,這種命根子需求使用第三方庫會帶來很多隱患。
行數方面
這是 Go 的小劣勢,總體表現力不如 Ruby / Python / Scala / 各種 FP。其中矬爆九天、蛋菊俱焚的一點是:它沒有泛型,以至於一個最簡單的數組的 reverse 都得給每個類型實現一次。有人可能會說,用 interface{} 或者 reflect 什麼的也可以,但從此程式的穩定性會走向不歸路。但無論如何,它比 C 家族代碼要短,如果能靈活運用閉包、defer,可以省不少事情。另外如果是並發邏輯比較複雜的情境,把 chan、select 用好,代碼可以比任何語言都短。
易理解度
跟大多數語言區別不明顯。但我最近讀了一些 C 家族的代碼,已經覺得有點不習慣了。我發現 C 家族的代碼有很大一部分是浪費在語言本身的破事上,Java 也好不到哪裡去。這麼一說 Go 還是應該算中上水平。
坑
目前我司在使用 Go 遇到的所有坑在網上都比較容易找到解決方案。官方文檔齊全,源碼也精簡易懂。第三方的東西不算多,但比起像 nodejs 那些稀巴爛的第三方庫品質好太多。有一點值得注意的是,我司沒有專門測試的員工,但 Go 實現的服務 bug 很少,基本上 bug 都是對業務理解的問題(或是偷懶啥的)所導致,而且 bug 出現之後對服務的影響都能被控制在一個範圍裡,這是一件很好的事情。不會像以前寫 C 家族時候出現指標亂飛、記憶體寫亂的狀況,也沒有 Python 同事經常出現的變數名 typo 問題(你見過幾個人愛用靜態檢查工具?),換句話說,Go 的程式健壯程度跟 Java 系列相仿。
印象比較深刻的就這些。對於我來說,如果 Go 把泛型補上就比較完美了