1. 程式人生 > >go 語言 優勢及 主要用途

go 語言 優勢及 主要用途

1、Go有什麼優勢

可直接編譯成機器碼,不依賴其他庫,glibc的版本有一定要求,部署就是扔一個檔案上去就完成了。
靜態型別語言,但是有動態語言的感覺,靜態型別的語言就是可以在編譯的時候檢查出來隱藏的大多數問題,動態語言的感覺就是有很多的包可以使用,寫起來的效率很高。
語言層面支援併發,這個就是Go最大的特色,天生的支援併發,我曾經說過一句話,天生的基因和整容是有區別的,大家一樣美麗,但是你喜歡整容的還是天生基因的美麗呢?Go就是基因裡面支援的併發,可以充分的利用多核,很容易的使用併發。
內建runtime,支援垃圾回收,這屬於動態語言的特性之一吧,雖然目前來說GC不算完美,但是足以應付我們所能遇到的大多數情況,特別是Go1.1之後的GC。
簡單易學,
Go語言
的作者都有C的基因,那麼Go自然而然就有了C的基因,那麼Go關鍵字是25個,但是表達能力很強大,幾乎支援大多數你在其他語言見過的特性:繼承、過載、物件等。 豐富的標準庫,Go目前已經內建了大量的庫,特別是網路庫非常強大,我最愛的也是這部分。 內建強大的工具,Go語言裡面內建了很多工具鏈,最好的應該是gofmt工具,自動化格式化程式碼,能夠讓團隊review變得如此的簡單,程式碼格式一模一樣,想不一樣都很困難。 跨平臺編譯,如果你寫的Go程式碼不包含cgo,那麼就可以做到window系統編譯linux的應用,如何做到的呢?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:分散式同步工具,類似ZooKeeper Heka:mazila開源的日誌處理系統 cbfs:couchbase開源的分散式檔案系統 tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣 groupcache:memcahe作者寫的用於Google下載系統的快取系統 god:類似redis的快取系統,但是支援分散式和擴充套件性 gor:網路流量抓包和重放工具


部署簡單。Go 編譯生成的是一個靜態可執行檔案,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需的各種包、庫的依賴關係,大大減輕了維護的負擔。這和 Python 有著巨大的區別。由於歷史的原因,Python 的部署工具生態相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及相容性問題】。官方 PyPI 源又經常出問題,需要搭建私有映象,而維護這個映象又要花費不少時間和精力。併發性好。Goroutine 和 channel 使得編寫高併發的服務端軟體變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效的利用多個 CPU 核,並行執行的效能好。這和 Python 也是天壤之比。多執行緒和多程序的服務端程式編寫起來並不簡單,而且由於全域性鎖 GIL 的原因,多執行緒的 Python 程式並不能有效利用多核,只能用多程序的方式部署;如果用標準庫裡的 multiprocessing 包又會對監控和管理造成不少的挑戰【我們用的 supervisor 管理程序,對 fork 支援不好】。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動後需要佔用 100MB 記憶體,而伺服器有 32 個 CPU 核,那麼留一個核給系統、執行 31 個應用副本就要浪費 3GB 的記憶體資源。良好的語言設計。從學術的角度講 Go 語言其實非常平庸,不支援許多高階的語言特性;但從工程的角度講,Go 的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程式設計師都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協作的一致性。比如 gofmt 自動排版 Go 程式碼,很大程度上杜絕了不同人寫的程式碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動執行 gofmt,這樣在編寫程式碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的程式碼。此外還有 gofix, govet 等非常有用的工具。執行效能好。雖然不如 C 和 Java,但通常比原生 Python 應用還是高一個數量級的,適合編寫一些瓶頸業務。記憶體佔用也非常省。