1.why Go?
接觸一門語言,首先我們要對這門語言有着感性的認識,在沒有了解該語言的語法細節下,我們要首先能對它的獨特魅力有初步掌握,只有這樣我們才能沿着正確的思維嚮導去感受這門語言的韻味~
爲什麼學習go語言,或者說go語言相對於其它的語言如C,Phython等有什麼樣的優勢,什麼場景下運用go語言可以最大程度發揮它的優勢?目前我大致在網絡上總結了如下幾點特徵:
(1)部署簡單,go語言是生成的靜態可執行文件,除了glibc之外沒有其他的外部依賴項,這對於部署人員來說無疑是非常方便的事情,他不用去維護各種包,庫的依賴關係,與phython在這一點的比較上具有巨大的優勢。
(2)具有良好的併發性,go語言的goroutine和channel使得編寫高併發的軟件變得相當容易,單個go應用可以有效的利用多個核,很多情況下完全不需要考慮鎖機制和由此引發的問題
(3)哲學藝術性的語言設計(這個實在很難體會,慢慢感受吧),從學術的角度講 Go 語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
- 服務器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日誌、數據打包、虛擬機處理、文件系統等。
- 分佈式系統,數據庫代理器等
- 網絡編程,這一塊目前應用最廣,包括Web應用、API應用、下載應用、
- 內存數據庫,前一段時間google開發的groupcache,couchbase的部分組建
- 雲平臺,目前國外很多雲平臺在採用Go開發,CloudFoundy的部分組建,前VMare的技術總監自己出來搞的apcera雲平臺
- Go的import包不支持版本,有時候升級容易導致項目不可運行,所以需要自己控制相應的版本信息
- Go的goroutine一旦啓動之後,不同的goroutine之間切換不是受程序控制,runtime調度的時候,需要嚴謹的邏輯,不然goroutine休眠,過一段時間邏輯結束了,突然冒出來又執行了,會導致邏輯出錯等情況。
- GC延遲有點大,我開發的日誌系統傷過一次,同時併發很大的情況下,處理很大的日誌,GC沒有那麼快,內存回收不給力,後來經過profile程序改進之後得到了改善。
- pkg下面的圖片處理庫很多bug,還是使用成熟產品好,調用這些成熟庫imagemagick的接口比較靠譜