為什麼要使用 Go 語言?Go 語言的優勢在哪裡?
使用 Go語言開發的比較成功的軟體有哪些?
國內有哪些公司正在使用 Go,有什麼指導意見嗎?
知乎大部分項目是 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 應用還是高一個數量級的,適合編寫一些瓶頸業務。內存佔用也非常省。
背景
在接觸Golang以前,我用C/C++、Lua及Python作為主要開發語言。
C/C++的問題:
- 開發效率低,對開發者要求高
- libc只向後兼容,運維難度偏大
Lua/Python的問題:
- 動態語言,缺少編譯過程,低級錯誤頻出
- 缺少有效的性能分析及調試工具
場景
當時剛完成了nginx WAF模塊的開發工作,便開始著手搭建WAF的後台管理系統。 由於之前同事都用的fluentd作為日誌收集組件,為保持基礎組件的一致性,我也選擇了fluentd。 即最終架構為fluentd-&>mongodb-&>mysql,再基於mysql做前端數據展示。 後來被坑了許多次,就決定用Go重寫fluentd以解決下面幾個問題:
- fluentd在ubuntu 9.04偶爾會出現假死,導致數據丟失
- fluentd難以接入公司現有的包發布系統,導致運維難度極大
- mongodb採用mmap實現,數據量大時佔用內存過高
方案
- gofluent的代碼 請點擊這裡
- httpmq的代碼 請點擊這裡
事實上,這兩個項目都是為了解決上面提到的問題。 說起來也許你不信,這兩個套代碼是我在業餘時間完成的,也就是說這根本不算在KPI之內。 其實一開始我也沒想到能夠這麼快就寫得七七八八,畢竟是現學現用啊。 但實際情況就是,我花了一周時間寫完httpmq,一個月多時間就寫好了gofluent……當然,這兩個項目還有很多不完善的地方。目前就日誌收集方案來說,我更推薦elastic/logstash-forwarder · GitHub和elastic/logstash · GitHub配合使用。
為什麼選擇Golang
那麼,為什麼我會選擇Golang呢?其實我在做出這個選擇之前已經花了大量時間做過詳盡調研。 國外如Google、AWS、Cloudflare、CoreOS等,國內如七牛、阿里等都已經開始大規模使用Golang開發其雲計算相關產品。 跟著世界級巨人的腳步應該不至於走錯方向,而且在學習Golang的過程中,我也漸漸被其背後的設計哲學所折服。
另外,雲風博客中曾說過這樣一句話:
我發現我花了四年時間錘鍊自己用 C 語言構建系統的能力,試圖找到一個規範,可以更好的編寫軟體。結果發現只是對 Go 的模仿。缺乏語言層面的支持,只能是一個拙劣的模仿。
以下則是我對Golang的淺薄理解:
- 有C基礎,學Golang非常輕鬆
- 同步方式輕鬆實現高並發
- 代碼簡潔,格式統一,閱讀方便
- 性能強勁的同時,開發效率又不差於Python等動態語言
效果
最開始準備上線的時候其實心裡挺忐忑,畢竟一旦出現故障,不僅黑鍋得自己背,面子也上過不去啊。 還好結果蠻漂亮,自上線後沒出現過一次突發性BUG,降低運維難度的同時還減少了機器的負載。
總而言之,從工程的角度上來看,對於大多數後台應用場景,選擇Golang是極為明智的選擇。 這樣可以很輕鬆的兼顧運行性能、開發效率及維護難度這三大讓諸多程序猿欲仙欲死的奇點。
----------------------- 廣告分割線 -------------------------
最近把項目里用到的框架開源出來了,歡迎關注 hnlq715/doggy
好多答主都是做WEB這塊的,可能會忽略一些特殊領域,比如我們這些做智能終端設備相關項目的。現在很多智能終端系統,例如我們常用的快遞櫃、取票機等。基本上操作系統都採用了Android或者Linux系統,硬體採用ARM主板和一堆的控制板。基本上甲方都需要加一些系統定製的內容,比如狀態欄隱藏、外設驅動適配等,這些都是系統級,採用C/C++/Java完成內核和系統的定製,這個沒什麼說的。重點是對這一堆控制板的底層介面、邏輯控制和上層介面的實現。以前我們都是採用APP里的NDK來實現,大量代碼耗費在Java和C++的相互調用上。後來直接採用C/C++直接編譯為可執行文件通過遠程調用提供給上層,開發效率有所提升。然而,甲方需求中很多新出現的內容開始讓我們應接不暇。例如:採用JSON格式通訊,採用瀏覽器作為客戶端調用底層,多個控制板需要並發同時控制。這些東西有的對於Java來說好弄,有的對於C++來說好弄,但是沒有一個能同時方便的實現上述功能的,直到發現了Go。考慮到行業人員因素,像我們這種做平台和控制的軟體工程師,大多對C和C++較為熟悉,轉去學習Go做這種必要的後台程序較為方便。而且硬體平台又特殊在不能方便的部署各類伺服器,用Java較為不便,用C/C++也不方便。即使採用Java和C++,又會存在交叉編譯,以及一大堆依賴庫的坑。而Go的標準庫都基本具備了這些功能,同時又能合理的利用現有的C/C++代碼。比較忙,寫的比較粗略,大致意思就是這樣。
我嘗試來回答你幾個問題:
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:網路流量抓包和重放工具
以下是一些公司,只是一小部分:
- 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
- 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
交流群:148647580
Go技術社區:Go 技術社區我補充一下。話說作者寫了個c++項目,差點吐血,語法太複雜,於是語法極度簡單的go出現了,所以和python不夠準確,應該和c++比。
py,rb這些需要運行環境,而且速度和編譯語言不在統一數量級別。當然go也沒有需要虛擬機語言的優勢。這點沒有重疊。至於重疊的地方,就因人而異了。
http://m.csdn.net/article/2012-07-05/2807113-less-is-exponentially-more
回想2007年9月的時候,我正在為Google龐大的C++程序做一些比較瑣碎但是核心的工作(對,就是你們都用過的那個!),我工作在Google龐大的分散式編譯集群上都需要花45分鐘。之後有幾個C++標準委員會的Google員工為我們做了個演講,他們給我們介紹了下C++0x(現在被叫做C++11)里會有什麼新東西。
在那一個小時的演講中,我們大概聽到了約35種計劃中的新特性。當然實際上還有更多,但是在那次演講中我們只聽到了35種左右。有的特性比較小,當然演講中所提到的任何一種特性都可以稱得上標誌性的:有的比較精妙,但是很難理解,像右值引用(RValue Reference);其它的很有C++的特色,例如variadic模板;還有一些只是一些相當瘋狂的,一如用戶定義文字(user-defined literal)。
這時候,我問了自己一個問題:C++委員會真的認為C++的特性還不夠多?當然,不同於Ron的玩笑,簡化這門語言必是一門更大的成就!也許這很可笑,但是請把這個想法記在心裡。
Go + Docker API服務開發和部署
為什麼選擇Go + Docker
筆者之前的項目開發主要使用Python。Python的優勢在於簡潔強大的語法,豐富的庫包,以及極高的開發效率,而劣勢在於通過解釋器執行使得性能不夠理想,缺少類型檢查導致代碼質量難以保證,全局鎖的存在限制了並發性能,此外缺乏對並發編程的良好支持。這些劣勢正好是Go的優勢。雖然在開發效率上Go跟Python還有差距,但相比於其它靜態類型語言,Go已經有很大提升了。
此外,筆者之前的項目部署主要使用virtualenv(Python 2)和pyvenv(Python 3)來創建獨立的應用環境,Supervisor來管理應用進程,Fabric來編寫自動化發布腳本。部署應用一鍵完成,已經能較好滿足大多數項目的部署需求。不過不太滿意的是,每次新增伺服器都要重複進行配置系統,安裝軟體,優化系統參數等工作,如果要遷移到其它機房或雲服務則會更麻煩。問題的根源在於,這種部署方式僅僅把應用依賴的語言庫包跟應用一起打了包,但沒有把應用運行依賴的系統環境也打包在一起。
Docker正好解決了這個問題,它將應用及其依賴的系統環境一起打包成一個Image(鏡像),後面使用這個Image就可以快速的把應用部署到任意的伺服器。Docker位於傳統的IaaS之上,它讓應用跟IaaS服務進行了解耦,這樣應用就可以很方便的在各個IaaS服務之間做遷移。不再像以前,一旦做出了選擇後面就再也沒得選了。
起源本文章系列是 React Native跨平台移動應用開發實戰 的姊妹篇,都是筆者在開發 在球場這款體育社交類應用過程中的技術總結。
內容目錄簡化版的代碼已在GitHub開源,在球場API服務開源版 。
- 開篇
- 使用Go來開發適用於生產環境的API服務
- API服務功能介紹
- Echo Web框架簡介
- 代碼目錄結構
- MVCS模式介紹
- 使用Godep來管理依賴
- 使用Viper來管理配置
- 使用Cobra來管理子命令
- 使用Logrus來列印日誌
- Model層實現
- Service層實現
- Controller層實現
- 使用Supervisor來管理服務進程
- 使用Fswatch來自動部署代碼更新
- 列印完整的請求和響應來輔助調試
- 使用Goconvey來進行測試
- Goconvey介紹
- 單元測試
- Model測試
- API測試
- 使用Docker來搭建開發和測試環境,以及部署上線
- Docker簡介
- 使用Docker來打包應用鏡像
- 使用Docker Compose來部署應用及其依賴服務
- 使用Docker Machine來管理容器主機
- 使用Docker來管理測試環境
其它資料
- 在球場API服務開源版
- 技術文章 - React Native跨平台移動應用開發實戰
- 在球場官網
語言和技術層面就不說了, 都是顯而易見的.
我們項目組已經拋棄C++全力使用golang了. 最大的優點: 招人方便, 只要是會一點C語言的, 都可以現學, 2~3天可以貢獻代碼
優勢樓上已經說得差不多了,就不累述啦。最近用Go寫了點東西,我來唱唱反調,說一些用起來讓人很不爽的細節。因為只是周末業餘玩一玩,有不對的地方,歡迎指正。
首先,當我需要一個通用鏈表的時候,在Go裡面會大致寫成如下的樣子:type LinkedList struct {
value interface{}
next *LinkedList
}
func (next * LinkedList) prepend( value interface{} ) *LinkedList {
return LinkedList { value, next }
}
func tail( value interface{} ) *LinkedList {
return LinkedList { value, nil }
}
func traverse( item * LinkedList ) {
if item == nil {
return
}
fmt.Println( item.value )
traverse( item.next )
}
上面這段代碼有那些彆扭的地方呢?
由於Go缺乏meta-programming能力,所以每個節點的value值必須得是interface {}。也就是說鏈表可以使用下面的方式構造,卻不會觸發任何的compiler complaint。當這樣的需求充斥整個代碼間,Go所擁有的靜態類型優勢也就消失殆盡了。stupidList := tail(1991).prepend("CAT").prepend([]byte{1, 16})
我們知道在C-families語言里,當鏈表結束時,都喜歡儲存一個特定的指針(NULL),作為約定俗成的終點,同樣在函數錯誤結束時,通常也會有相似的行為。但空指針是一個非常危險的東西,程序員很可能由於忘記檢查其是否為NULL而導致程序崩潰,編譯器的類型系統也無法對其作出任何的保證,因為程序員可以簡單的把空指針聲明為任何類型。
在函數錯誤驗證上,Go試圖採用multiple return的方式額外返回一個failure解決這個問題,但與返回空指針沒有本質區別,都丟掉了編譯期檢查。實際上在functional programming里早就有相應的解決辦法了——Algebraic Types。
以Haskell為例:-- 用End作為鏈表終點
data List t = End | Cons t ( List t )
let my_list = Cons 3 ( Cons 6 ( Cons 9 End ) )
-- 用Nothing作為函數執行錯誤或者空的結果
search [] = Nothing
search (h:tails) = if h == 1 then Just h else search tails
其次,Go不支持任何內置運算元以及關鍵字擴展的操作。Go為了避免過度複雜化的設計,實際上使得編碼工作變得更加複雜了。
以數學矩陣運算為例,對於矩陣的加操作,我希望可以通過「+」運算元來進行,以使它更像是內置的數據類型。在Python里,我可以重載__add__()來完成這一目的,只因為Python/c++等等這些語言都將運算元視作函數。我甚至可以通過重載iterator的行為,來達成for遍歷器的效果。for item in MyType: ...
最後,說一說Go體系里最亮眼的goroutine和chan。我覺得並發如果想要做成語言層面的syntactic sugar,都沒有辦法繞過大並發(massive concurrency)、競爭條件(race condition)、錯誤處理(error handling)這三個問題;
在大並發方面,Go解決得很好,但本質也就是user-space thread,並不是什麼先進的技術;
競爭條件本質上是多個邏輯流對同一片內存進行no-sync操作而產生的。最簡單的辦法就是避免寫操作,比如Haskell中的做法,從根本上取消了變數的重複寫操作,競爭條件也就無從說起。但在實際的工作中,總是沒有辦法避免去操作global-state,也沒有辦法嚴格的按照函數式編程去避免side-effects。
那麼我們可以稍微退一步,採取一種較弱的模型——保證每個邏輯流都使用獨立的內存空間,限定一些受到約束的方法進行溝通。在Erlang中,採用了這種嚴格的進程內存模型,進程間的交流只能通過傳遞消息來發生。Go啟用Chan通道基本也是這個思路,但出於效率的考量(傳遞消息需要複製操作),沒有做任何強制性的保證,依然可以輕鬆地對共享內存進行訪問。程序的正確性只依賴於程序員正確使用並嚴格遵守slogan。do not communicate by sharing memory; instead, share memory by communicating.
另外,相對比於Erlang,Go中對於創建的協程缺乏定位能力(no identity),協程之間也並不是完全獨立的(no process isolation)。當系統異常發生(比如除零),往往會當掉整個程序,而不能進行狀態回退與恢復操作。
當然在並發和協程錯誤處理上,畢竟是不同的模型,各有取捨,誰優誰劣因看法而異了。
------知乎回答裡面敲代碼不能識別TAB真是太難受了。該at誰來改善下?
Go的優勢在於更高的productivity ! 節省時間,節省生命。
1. 語法簡單。你的大腦更多的用於解決問題,而不是和語法打架。打贏了語法又如何?會了幾種寫法又如何?
2. Type checking. 按照你想的做法寫出來,編譯成功之後,一般就可以運行了。
3. 運行簡單。不需要動態鏈接,不需要保證庫版本匹配(想想Java的庫只有到運行時才發現不匹配,多蛋痛。Go 編譯時就由程序作者搞定了,而不是部署時去折騰)。
王垠說:go裡面好的東西都不是新創的.windows、iphone剛出來的時候大家都這麼說。
王垠當初噴windows的時候也是用這個邏輯。雖然他後面道歉了,說windows比linux好的多。
但是語言並沒有進步。
對於項目而言:需要的是工程語言,不是理論語言。 語言發展到今天,也需要用產品經理的邏輯
好壞的發展標準應該是:無到有,從有到好,從好到合適。
設計複雜並不難,難的是滿足用戶絕大部分需求的情況下,又能設計成極簡單。
對很多場景來講,go是一門合適的語言。每一個設計點都是一種權衡。
語法設計、面象對象設計、並發設計,每一個都是精心思考過的。
其目的就是讓你用最小的成本獲取最大的收益(最小的開發時間、最小的bug、更高的系統性能和穩定性)。
golang 與 python
是兩個我作為十年不寫程序的人
一邊看 tutorial 一邊寫
居然也就會動了的語言
(就是可以 build 成 binary 的 shell script)
(居然還跑得蠻快的)
最近,我在美團引入go語言,來解決一個系統的性能問題( 穩定性,latency)。 整體收益良好,很好的解決了問題。 我寫了一個對調用方透明的proxy cache server,轉發請求,cache結果,一定的策略代理後端n台服務
它的優勢:
- 良好的性能
- 並發支持良好,並且可以很好的利用多核心
- 簡單,容易上手使用
重劍無鋒,大巧不工。
優勢:
1. 有Google這個大廠在背後撐腰,語言設計質量值得期待;
2. 有活躍社區支持,組件/產品的開發和使用值得發掘,服務質量值得期待;
3. 各種相關基礎設施完備好用;
4. 語言學習難度低,上手快,人力資源培養速度和質量便於估量;
5. 有望成為Google下一代的統一開發平台,徹底擺脫Java的陰影。
# 國內使用Go語言開發的項目
七牛雲存儲
- 產品網址:雲存儲首頁 七牛雲存儲
- 應用範圍:整個產品(包括基礎服務、Web端、統計平台、各類小工具等等)
QOR - 模塊化的電商系統 (開源項目)
- QOR官網: QOR: E-commerce CMS SDK written in Go
- github地址: qor/qor · GitHub
- 應用範圍: 整個產品
美團後台流量支撐程序
- 產品網址:【美團網團購】吃喝玩樂好幫手,專業品質團購網
- 應用範圍:支撐主站後台流量(排序,推薦,搜索等),提供負載均衡,cache,容錯,按條件分流,統計運行指標(qps,latency)等功能。
weico 3.0
- 產品網址:Weico-最具人氣的微博客戶端
- 應用範圍: 服務端所有代碼
仙俠道
- 產品網址:仙俠道官網 - 心動遊戲
- 應用範圍: 遊戲服務端(通訊、邏輯、數據存儲)
快玩遊戲
- 網址:快玩小遊戲,單機遊戲,網頁遊戲,快玩遊戲,快玩遊戲盒
- 應用範圍:實時消息系統、用戶認證、用戶會話、統一統計介面
金山微看
- 網址:微看|微看電視
- 應用範圍:服務介面,後台流程服務,消息系統,圖片系統
盛大雲CDN
- 網址:盛大雲計算
- 應用範圍:CDN的調度系統、分發系統、監控系統、短域名服務,CDN內部開放平台、運營報表系統以及其他一些小工具等
京東消息推送雲服務/京東分散式文件系統
- 網址: 京東雲
- 應用範圍:後台所有服務全部用go實現
華大基因科技服務互動式數據分析
- 網址: http://www.bgitechsolutions.com
- - 應用範圍:後台用go實現,調用R實現統計分析,分析結果傳遞給前端的Highcharts
群策
- 網址:群策 - 統一團隊溝通,高效完成工作
- 應用範圍:全系統
BiddingX DSP廣告投放系統
- 網址:BiddingX_專業的DSP解決方案供應商
- 應用範圍:競價投放、曝光統計、點擊跳轉
Bmob移動後端雲服務平台
- 產品網址:Bmob移動後端雲服務平台
- 應用範圍:Restful API(使用Beego)、統計分析平台、常用服務如發郵件、隊列非同步處理、統計用戶空間和介面請求
街坊四鄰
- 網址:首頁 - 街坊四鄰
- 應用範圍:後台服務
小米搶購系統/日誌平台
- 網址:www.mi.com
- 應用範圍:秒殺系統,日誌平台,驗證碼服務
Leanote
- 網址:Leanote
Bearychat
- 網址:BearyChat
宅豆
- 網址:宅豆網 - 自築最美家,宅豆隨你搭
白板- 設計圖討論工具
- 網址:白板
實驗樓
- 網址:實驗樓 - 第一家以實驗為核心的IT在線教育平台
Golang是一個新語言。Golang的設計者是Robert Griesemer, Rob Pike和Ken Thompson,當年設計C和Unix,後來的Plan9團隊中的人 。Golang的設計理念很明確,就是將動態類型語言的編程容易度和靜態類型語言的安全效率結合起來。
優點:
1. 保留但大幅度簡化指針
2. 多參數返回
3. Array,slice,map等內置基本數據結構
4. Interface
Golang最讓人讚歎不易的特性,就是interface的設計。任何數據結構,只要實現了interface所定義的函數,自動就implement了這個interface,沒有像Java那樣冗長的class申明,提供了靈活太多的設計度和OO抽象度,讓你的代碼也非常乾淨。千萬不要以為你習慣了Java那種一條一條加implements的方式,感覺還行,等介面的設計越來越複雜的時候,無數Bug正在後面等著你。
同時,正因為如此,Golang的interface可以用來表示任何generic的東西,比如一個空的interface,可以是string可以是int,可以是任何數據類型,因為這些數據類型都不需要實現任何函數,自然就滿足空interface的定義了。加上Golang的type assertion,可以提供一般動態語言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯誤。
5. OO
6. Goroutine
7. 更多現代的特性
如果你是Python和動態語言狂熱愛好者,Go不一定能給你帶來很大的驚喜,這純粹取決於你得項目性質,考慮到Python目前在很多地方都用C做核心運算,速度在大部分情況下都不是大問題。scalability是一個問題,但並不是人人都會遇到的。
如果你是C愛好者,強烈建議你學習和使用Go。Go可以調用C/C++程序,又提供了太多的便利,速度上稍有犧牲,但並不大。在絕大部分場景下Go能給你帶來媲美C的性能,而對於某些確實性能過於關鍵的場合,也可以通過cgo讓Go和C搭配。
如果你是Java愛好者,除非你是做Android這種不得不用Java的平台,否則也建議你嘗試學習Go,這個開發上感覺的差異如同比較開載著1噸石頭的拖拉機和開保時捷911那麼明顯,而Java能給你的,Go能給得更好。
如果你是C++愛好者,!@#$%^*,恭喜你,至少你的智商應該是沒問題的。人生苦短,趕緊脫離C++這個苦海吧。你用來學89個C++高級特性的時間,估計已經用Go寫了64個開源項目了。
如果你是像我一樣的C和Python的愛好者,對動態語言又沒有特殊的熱愛……我還需要說什麼呢?
讓我們盪起雙槳,去遨遊Golang的海洋吧。
c語言用來學習編程基礎和指針數據結構,c++用來寫c的應用,java用來寫跨平台應用,做網站。lua,python均用來當腳本用,phpmysql快速做網站,htmlcss編出漂亮的網頁,js用來網頁動態處理,說實話當水平到了我這個程度就會思考go語言能對我現在的項目有什麼用,能不能把現在項目語言難處理的用go來處理。而不是探討這個慢那個快,沒有意義,要速度快那就彙編寫吧,我第一次寫rootkit驅動都是用的彙編
簡單談幾點
- Go只有25個關鍵字,很好地借鑒了C和JavaScript,而非C++/Java,去掉了class/abstract/public/private 這些傳統靜態OO語言"高大上"的東西,語言核心簡單,性能極好,上手極快。個人認為隨著GO的穩定,以後應該會出現類似JS中CoffeeScript/ TypeScript這樣編繹到Go的高極語言。
- Go似乎有所有動態語言的特性,閉包,但又有靜態語言的性能。
- Google未來肯定是要去Java的,未來即將支持Android: Android即將支持GO語言,從遊戲開始
GO = 接近C的運行效率 + 接近Python的開發效率
Go沒有動態庫或者動態類載入的靈活的插件機制,如果我要對程序裡面的某個包在線熱升級,怎麼搞?因為這個新的包修復了幾個緊急bug s !
推薦閱讀:
※Go 語言的面世是為了解決什麼問題,新的語言出現的動力是什麼?
※很多西方人念漢語的「窩們歪果人」這樣的聲調是因為什麼?
※哪些翻譯讓你感嘆「語言是如此之美」?
※現在有必要區分「的」、「地」、「得」嗎?
※想用 GO 寫一個開源分散式數據處理相關的系統,並學習 GO,有什麼建議?