這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
天空飄來一個“Go”,於是我google...
Go是什麼:
Go是Google開發的一種編譯型,並發型,並具有記憶體回收功能的程式設計語言。
Go語言是Google2009發布的第二款開源程式設計語言。
Go語言專門針對多處理器系統應用程式的編程進行了最佳化,使用Go編譯的程式可以媲美C或C++代碼的速度,而且更加安全、支援並行進程。
Go要幹什麼:
Go的目標是希望提升現有程式設計語言對程式庫等依賴性(dependency)的管理,這些軟體元素會被應用程式反覆調用。由於存在並行編程模式,因此這一語言也被設計用來解決多處理器的任務。
Google大約2007年開始開發Go,並於2008年投入了一組全職員工。Google當初將該語言設計為一款系統程式設計語言,可以被用於網路伺服器、儲存系統和資料庫中。但是Google認為,該語言還有望被用於其它領域。
Go團隊:
Thompson:1983年圖靈獎(Turing Award)和1998年美國國家技術獎(National Medal of Technology)得主。他與Dennis Ritchie是Unix的原創者。Thompson也發明了後來衍生出C語言的B程式語言。
Pike:曾是貝爾實驗室(Bell Labs)的Unix團隊,和Plan 9作業系統計劃的成員。他與Thompson共事多年,並共創出廣泛使用的UTF-8 字元編碼。
Robert Griesemer:曾協助製作Java的HotSpot編譯器,和Chrome瀏覽器的JavaScript引擎V8。
此外還有Plan 9開發人員Russ Cox、和曾改善已廣泛使用之開原碼編譯器GCC的Ian Taylor。
以下轉自之乎回答(http://www.zhihu.com/question/21409296)
一:from asta謝
我嘗試來回答你幾個問題:
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開源的Tlog系統
cbfs:couchbase開源的Distributed File System
tsuru:開源的PAAS平台,和SAE實現的功能一模一樣
groupcache:memcahe作者寫的用於Google下載系統的緩衝系統
god:類似redis的緩衝系統,但是支援分布式和擴充性
gor:網路流量抓包和重放工具
以下是一些公司,只是一小部分:
http://Apcera.com
http://Stathat.com
Juju at Canonical/Ubuntu, presentation
http://Beachfront.iO at Beachfront Media
CloudFlare
Soundcloud
Mozilla
Disqus
http://Bit.ly
Heroku
google
youtube
下面列出來了一些使用的使用者
GoUsers - go-wiki - A list of organizations that use Go.
4、Go還存在的缺點
以下缺點是我自己在項目開發中遇到的一些問題:
Go的import包不支援版本,有時候升級容易導致項目不可運行,所以需要自己控制相應的版本資訊
Go的goroutine一旦啟動之後,不同的goroutine之間切換不是受程式控制,runtime調度的時候,需要嚴謹的邏輯,不然goroutine休眠,過一段時間邏輯結束了,突然冒出來又執行了,會導致邏輯出錯等情況。
GC延遲有點大,我開發的日誌系統傷過一次,同時並發很大的情況下,處理很大的日誌,GC沒有那麼快,記憶體回收不給力,後來經過profile程式改進之後得到了改善。
pkg下面的圖片處理庫很多bug,還是使用成熟產品好,調用這些成熟庫imagemagick的介面比較靠譜
最後還是建議大家學習Go,這門語言真的值得大家好好學習,因為它可以做從底層到前端的任何工作。
學習Go的話歡迎大家通過我寫的書來學習,我已經開源在github:
astaxie/build-web-application-with-golang · GitHub
還有如果你用來做API開發或者網路開發,那麼我做的開源架構beego也許適合你,可以適當的來學習一下:
astaxie/beego · GitHub
二:from Rio
知乎大部分項目是 Python 寫的,有幾個小項目是用 Go 寫的。我從一個 Python 為主的開發人員的角度說說對 Go 的優點的體會吧:
部署簡單。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 應用還是高一個數量級的,適合編寫一些瓶頸業務。記憶體佔用也非常省。
三:from 沈鋒
最近,我在美團引入go語言,來解決一個系統的效能問題( 穩定性,latency)。 整體收益良好,很好的解決了問題。 我寫了一個對調用方透明的proxy & cache server,轉寄請求,cache結果,一定的策略代理後端n台服務
它的優勢:
良好的效能
並發支援良好,並且可以很好的利用多核心
簡單,容易上手使用