1. 程式人生 > >為什麽要使用 Go 語言?Go 語言的優勢在哪裏?

為什麽要使用 Go 語言?Go 語言的優勢在哪裏?

gic 成熟 ann 優秀 機制 執行文件 假設 href 多個

Go語言官方自稱,之所以開發Go 語言,是因為“近10年來開發程序之難讓我們有點沮喪”。 這一定位暗示了Go語言希望取代C和Java的地位,成為最流行的通用開發語言。

  編程語言已經非常多,偏性能敏感的編譯型語言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速業務開發的動態解析型語言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定領域的語言有Erlang、R和MATLAB等,那麽我們為什麽需要 Go這樣一門新語言呢?下面我們一起看一下近三年來GO語言在西方國家的使用情況,正傑只能說一路飆升,而且飆升的速度比python還要快!GO語言相較與其他語言具有哪些優勢呢?

推薦GO語言學習課程:Go語言從入門到進階實戰

1、部署簡單。Go 編譯生成的是一個靜態可執行文件,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關系,大大減輕了維護的負擔。這和 Python 有著巨大的區別。由於歷史的原因,Python 的部署工具生態相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及兼容性問題】。官方 PyPI 源又經常出問題,需要搭建私有鏡像,而維護這個鏡像又要花費不少時間和精力。

2、並發性好。Goroutine 和 channel 使得編寫高並發的服務端軟件變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效的利用多個 CPU 核,並行執行的性能好。這和 Python 也是天壤之比。多線程和多進程的服務端程序編寫起來並不簡單,而且由於全局鎖 GIL 的原因,多線程的 Python 程序並不能有效利用多核,只能用多進程的方式部署;如果用標準庫裏的 multiprocessing 包又會對監控和管理造成不少的挑戰【我們用的 supervisor 管理進程,對 fork 支持不好】。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動後需要占用 100MB 內存,而服務器有 32 個 CPU 核,那麽留一個核給系統、運行 31 個應用副本就要浪費 3GB 的內存資源。

3、良好的語言設計。從學術的角度講 Go 語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。

4、執行性能好。雖然不如 C 和 Java,但通常比原生 Python 應用還是高一個數量級的,適合編寫一些瓶頸業務。內存占用也非常省。

Go就是基因裏面支持的並發,可以充分的利用多核,很容易的使用並發。內置runtime,支持垃圾回收,這屬於動態語言的特性之一吧,雖然目前來說GC不算完美,但是足以應付我們所能遇到的大多數情況,特別是Go1.1之後的GC。簡單易學,Go語言的作者都有C的基因,那麽Go自然而然就有了C的基因,那麽Go關鍵字是25個,但是表達能力很強大,幾乎支持大多數你在其他語言見過的特性:繼承、重載、對象等。豐富的標準庫,Go目前已經內置了大量的庫,特別是網絡庫非常強大,我最愛的也是這部分。內置強大的工具,Go語言裏面內置了很多工具鏈,最好的應該是gofmt工具,自動化格式化代碼,能夠讓團隊review變得如此的簡單,代碼格式一模一樣,想不一樣都很困難。跨平臺編譯,如果你寫的Go代碼不包含cgo,那麽就可以做到window系統編譯linux的應用,如何做到的呢?

1、Go引用了plan9的代碼,這就是不依賴系統的信息。內嵌C支持,前面說了作者是C的作者,所以Go裏面也可以直接包含c代碼,利用現有的豐富的C庫。

2、Go適合用來做什麽服務器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日誌、數據打包、虛擬機處理、文件系統等。分布式系統,數據庫代理器等網絡編程,這一塊目前應用最廣,包括Web應用、API應用、下載應用、內存數據庫,前一段時間google開發的groupcache,couchbase的部分組建雲平臺,目前國外很多雲平臺在采用Go開發,CloudFoundy的部分組建,前VMare的技術總監自己出來搞的apcera雲平臺。

3、Go成功的項目nsq:bitly開源的消息隊列系統,性能非常高,目前他們每天處理數十億條的消息docker:基於lxc的一個虛擬打包工具,能夠實現PAAS平臺的組建。packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者skynet:分布式調度框架Doozer:分布式同步工具,類似ZooKeeperHeka:mazila開源的日誌處理系統cbfs:couchbase開源的分布式文件系統tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣groupcache:memcahe作者寫的用於Google下載系統的緩存系統god:類似redis的緩存系統,但是支持分布式和擴展性gor:網絡流量抓包和重放工具以下是一些公司,只是一小部分。

4、Go還存在的缺點以下缺點是我自己在項目開發中遇到的一些問題:Go的import包不支持版本,有時候升級容易導致項目不可運行,所以需要自己控制相應的版本信息Go的goroutine一旦啟動之後,不同的goroutine之間切換不是受程序控制,runtime調度的時候,需要嚴謹的邏輯,不然goroutine休眠,過一段時間邏輯結束了,突然冒出來又執行了,會導致邏輯出錯等情況。GC延遲有點大,我開發的日誌系統傷過一次,同時並發很大的情況下,處理很大的日誌,GC沒有那麽快,內存回收不給力,後來經過profile程序改進之後得到了改善。pkg下面的圖片處理庫很多bug,還是使用成熟產品好,調用這些成熟庫imagemagick的接口比較靠譜最後還是建議大家學習Go,這門語言真的值得大家好好學習,因為它可以做從底層到前端的任何工作。

推薦GO語言學習課程:Go語言從入門到進階實戰

為什麽要使用 Go 語言?Go 語言的優勢在哪裏?