LZ最近從上家公司java轉到go,工作內容還是主要業務邏輯代碼,感覺go寫起來不是很順暢(oop思想可能根深蒂固了,語言熟練度也是一個原因),一個Orm框架用起來就特別麻煩。。。個人感覺基於go的特性還是做一些基礎的伺服器組件會很有優勢。。寫一般的業務代碼簡直彆扭。。沒泛型、if err != nil等等.. 當然好處就是很多東西要自己實現,沒有可靠的輪子。。。大家都用GO做什麼呢


Go 的優點:實現快 + 資源佔用低 + 任意環境隨便跑,綜合考慮在很多場景十分好使 。

  1. Go 適合造輪子,哪個庫不好用就自己造。
  2. Go 適合寫工具,比如 hugo 、hub、fzf,還有國人寫的 linux 下的百度 pan client 都是 go 實現的。
  3. Go 適合實現 C/C++ 一部分業務,Java 的大部分業務。
  4. Go 適合做最外層的膠水,通過 RPC/REST/CGO 粘合不同語言的模塊,而在這個膠水層還可以實現各種業務邏輯,又不用像 shell/py/node 有諸多顧慮和侷限。

Go 提供了纖程、指針、 unsafe, cgo 加上 C/C++ 兼容的內存佈局和跨平臺的彙編,有了這些你能做的事情的上限基本就非常高了。

所以問題不是它適合做什麼,是你有能力用它做什麼。

在用 Go 寫一個渲染器,因為學圖形,需要一個應用框架來複現各類圖形技術、論文和學習實踐 PBRT 。

開始用 C++ 和 Go 同時寫,主要實現是 C++,Go 只用來做架構探路,搞搞快速原型。

中間需要實現一個非同步消息框架,負責 GLFW 的 key event 和 window event 與圖形邏輯、骨骼計算、camera 控制進行數據通訊,還要保證所有繪製 event 都在主線程做 draw call。這個功能用 Go 實現的邏輯 100 行不到,只用了3個特性:chan, init(),不定長參數。當初設計 + 查語法 + 寫完 + 測試只花了大概 40 分鐘,然後一直用到現在。

在做的過程中發現 Go 實現各種邏輯太方便了,而且基本上沒啥幹不了的,最後決定全部用 Go ,放棄 C++。

中間發現 Go 的標準庫不支持 DDS 貼圖,直接擼了個 Go 版的 DDS 庫。大致就是看了下 wiki 瞭解了 DDS 格式,然後從 nv_dds 找到關鍵代碼,逐行翻譯成 Go 就搞定了,非常簡單。

現在在寫骨骼動畫和 GUI, GUI 在參考一個日本人移植到 Go 的 nanovg 和 nanogui,非常有價值,他用 Go 實現了基於 OpenGL 的 draw api 還用 Go 搞定了 true type 字體的繪製。

因為需要管理大量模型的狀態,打算用 orm + sqlite。但 gorm 的很多地方都不滿意,也在考慮自己擼。

現在這個渲染器是這個程度:

Java 能寫我的世界,C# 能寫 Unity,Go 自然也能寫遊戲引擎,當然也能寫其他更簡單的系統,比如一些所謂「很複雜」的業務系統。

Go 不管寫業務還是造輪子都很高效,既有高級語言特性,又能當更好的 C 用,構建部署也簡單。

常規業務 Go 能被 C/C++ 碾壓的主要就是瞬時的峯值內存,這個無解,但碾 Java 也沒問題。

目前後端這塊我沒覺得什麼是 Go 特別不適合幹或者不能幹的。

如果不用 Go,我估計也只會用 Rust,如果要寫大量矩陣運算,泛型和操作符重載是僅有的我想要但 Go 沒有的。

實際上用 Go 的很多也是多語言的牛人,比如 junegunn、spf13,都是背著幾個幾萬 star 項目。

最後舉幾個比較偏但有意思的項目:

hunterloftis/pbr 一個 Go 寫的基於物理渲染的光追渲染器

fogleman/pt 另一個光追渲染器

shibukawa/nanovgo 日本人移植的 Go 版的 nanovg,基於 OpenGL 實現了畫框、畫線、畫字的 Go API,相當於原來 Windows 上的 Direct Draw

shibukawa/nanogui-go 上面那位作者移植的 Go 版的 nanogui,基於他移植的 nanovgo 實現的 GUI 庫

Shopify/go-lua Go 實現的 lua 5.2 VM

wooga/go-entitas 一個非常精簡的 ECS 實現

最後說一句,這個世界上有太多有意思的問題和領域值得學習和探索。

語言最終是用來表達你思想和思維的,只要能幫你快速解決問題達到目標,對你而言就是好語言。


GO語言的發展與現狀

發展歷史

2007年9月,Rob Pike在Google分散式編譯平臺上進行C++編譯,在漫長的等待過程中,他和Robert Griesemer探討了程序設計語言的一些關鍵性問題,他們認為,簡化編程語言相比於在臃腫的語言上不斷增加新特性,會是更大的進步。隨後他們在編譯結束之前說服了身邊的Ken Thompson,覺得有必要為此做一些事情。幾天後,他們發起了一個叫Golang的項目,將它作為自由時間的實驗項目。

2008年5月 Google發現了GO語言的巨大潛力,得到了Google的全力支持,這些人開始全職投入GO語言的設計和開發。

2009年11月 GO語言第一個版本發布。2012年3月 第一個正式版本Go1.0發布。

2015年8月 go1.5發布,這個版本被認為是歷史性的。完全移除C語言部分,使用GO編譯GO,少量代碼使用彙編實現。另外,他們請來了內存管理方面的權威專家Rick Hudson,對GC進行了重新設計,支持並發GC,解決了一直以來廣為詬病的GC時延(STW)問題。並且在此後的版本中,又對GC做了更進一步的優化。到go1.8時,相同業務場景下的GC時延已經可以從go1.1的數秒,控制在1ms以內。GC問題的解決,可以說GO語言在服務端開發方面,幾乎抹平了所有的弱點。

在GO語言的版本迭代過程中,語言特性基本上沒有太大的變化,基本上維持在GO1.1的基準上,並且官方承諾,新版本對老版本下開發的代碼完全兼容。事實上,GO開發團隊在新增語言特性上顯得非常謹慎,而在穩定性、編譯速度、執行效率以及GC性能等方面進行了持續不斷的優化。

開發團隊

GO語言的開發陣營可以說是空前強大,主要成員中不乏計算機軟體界的歷史性人物,對計算機軟體的發展影響深遠。Ken Thompson,來自貝爾實驗室,設計了B語言,創立了Unix操作系統(最初使用B語言實現),隨後在Unix開發過程中,又和Dennis Ritchie一同設計了C語言,繼而使用C語言重構了Unix操作系統。Dennis Ritchie和Ken Thompson被稱為Unix和C語言之父,並在1983年共同被授以圖靈獎,以表彰他們對計算機軟體發展所作的傑出貢獻。Rob Pike,同樣來自貝爾實驗室,Unix小組重要成員,發明瞭Limbo語言,並且和Ken Thompson共同設計了UTF-8編碼,《Unix編程環境》、《編程實踐》作者之一。

可以說,GO語言背靠Google這棵大樹,又不乏牛人坐鎮,是名副其實的「牛二代」。

大名鼎鼎的Docker,完全用GO實現,業界最為火爆的容器編排管理系統kubernetes,完全用GO實現,之後的Docker Swarm,完全用GO實現。除此之外,還有各種有名的項目如etcd/consul/flannel等等,均使用GO實現。有人說,GO語言之所以出名,是趕上了雲時代,但為什麼不能換種說法,也是GO語言促使了雲的發展?

除了雲項目外,還有像今日頭條、UBER這樣的公司,他們也使用GO語言對自己的業務進行了徹底的重構。

GO語言關鍵特性

GO語言之所以厲害,是因為它在服務端的開發中,總能抓住程序員的痛點,以最直接、簡單、高效、穩定的方式來解決問題。這裡我們並不會深入討論GO語言的具體語法,只會將語言中關鍵的、對簡化編程具有重要意義的方面介紹給大家,跟隨大師們的腳步,體驗GO的設計哲學。

GO語言的關鍵特性主要包括以下幾方面:

  • 並發與協程
  • 基於消息傳遞的通信方式
  • 豐富實用的內置數據類型
  • 函數多返回值
  • defer機制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 編程規範

在當今這個多核時代,並發編程的意義不言而喻。當然,很多語言都支持多線程、多進程編程,但遺憾的是,實現和控制起來並不是那麼令人感覺輕鬆和愉悅。Golang不同的是,語言級別支持協程(goroutine)並發(協程又稱微線程,比線程更輕量、開銷更小,性能更高),操作起來非常簡單,語言級別提供關鍵字(go)用於啟動協程,並且在同一臺機器上可以啟動成千上萬個協程。

對比JAVA的多線程和GO的協程實現,明顯更直接、簡單。這就是GO的魅力所在,以簡單、高效的方式解決問題,關鍵字go,或許就是GO語言最重要的標誌。

基於消息傳遞的通信方式

在非同步的並發編程過程中,只能方便、快速的啟動協程還不夠。協程之間的消息通信,也是非常重要的一環,否則,各個協程就會成為脫韁的野馬而無法控制。在GO語言中,使用基於消息傳遞的通信方式(而不是大多數語言所使用的基於共享內存的通信方式)進行協程間通信,並且將消息管道(channel)作為基本的數據類型,使用類型關鍵字(chan)進行定義,並發操作時線程安全。這點在語言的實現上,也具有革命性。可見,GO語言本身並非簡單得沒有底線,恰恰他們會將最實用、最有利於解決問題的能力,以最簡單、直接的形式提供給用戶。

Channel並不僅僅只是用於簡單的消息通信,還可以引申出很多非常實用,而實現起來又非常方便的功能。比如,實現TCP連接池、限流等等,而這些在其它語言中實現起來並不輕鬆,但GO語言可以輕易做到。

GO語言作為編譯型語言,在數據類型上也支持得非常全面,除了傳統的整型、浮點型、字元型、數組、結構等類型外。從實用性上考慮,也對字元串類型、切片類型(可變長數組)、字典類型、複數類型、錯誤類型、管道類型、甚至任意類型(Interface{})進行了原生支持,並且用起來非常方便。比如字元串、切片類型,操作簡便性幾乎和python類似。

另外,將錯誤類型(error)作為基本的數據類型,並且在語言級別不再支持try…catch的用法,這應該算是一個非常大膽的革命性創舉,也難怪很多人吐槽GO語言不倫不類。但是跳出傳統的觀念,GO的開發者認為在編程過程中,要保證程序的健壯性和穩定性,對異常的精確化處理是非常重要的,只有在每一個邏輯處理完成後,明確的告知上層調用,是否有異常,並由上層調用明確、及時的對異常進行處理,這樣纔可以高程度的保證程序的健壯性和穩定性。雖然這樣做會在編程過程中出現大量的對error結果的判斷,但是這無疑也增強了開發者對異常處理的警惕度。而實踐證明,只要嚴格按GO推薦的風格編碼,想寫出不健壯的代碼,都很難。當然,前提是你不排斥它,認可它。

在語言中支持函數多返回值,並不是什麼新鮮事,Python就是其中之一。允許函數返回多個值,在某些場景下,可以有效的簡化編程。GO語言推薦的編程風格,是函數返回的最後一個參數為error類型(只要邏輯體中可能出現異常),這樣,在語言級別支持多返回值,就很有必要了。

Defer延遲處理機制

在GO語言中,提供關鍵字defer,可以通過該關鍵字指定需要延遲執行的邏輯體,即在函數體return前或出現panic時執行。這種機制非常適合善後邏輯處理,比如可以儘早避免可能出現的資源泄漏問題。

可以說,defer是繼goroutine和channel之後的另一個非常重要、實用的語言特性,對defer的引入,在很大程度上可以簡化編程,並且在語言描述上顯得更為自然,極大的增強了代碼的可讀性。

Golang作為強類型的編譯型語言,靈活性上自然不如解析型語言。比如像PHP,弱類型,並且可以直接對一個字元串變數的內容進行new操作,而在編譯型語言中,這顯然不太可能。但是,Golang提供了Any類型(interface{})和強大的類型反射(reflect)能力,二者相結合,開發的靈活性上已經很接近解析型語言。在邏輯的動態調用方面,實現起來仍然非常簡單。既然如此,那麼像PHP這種解析型語言相比於GO,優勢在那裡呢?就我個人而言,寫了近10年的PHP,實現過開發框架、基礎類庫以及各種公共組件,雖然執行性能不足,但是開發效率有餘;而當遇上Golang,這些優勢似乎不那麼明顯了。

作為出現在互聯網時代的服務端語言,面向用戶服務的能力必不可少。GO在語言級別自帶HTTP/TCP/UDP高性能伺服器,基於協程並發,為業務開發提供最直接有效的能力支持。要在GO語言中實現一個高性能的HTTP Server,只需要幾行代碼即可完成,非常簡單。

在GO語言中,有一套標準的工程管理規範,只要按照這個規範進行項目開發,之後的事情(比如包管理、編譯等等)都將變得非常的簡單。

在GO項目下,存在兩個關鍵目錄,一個是src目錄,用於存放所有的.go源碼文件;一個是bin目錄,用於存在編譯後的二進位文件。在src目錄下,除了main主包所在的目錄外,其它所有的目錄名稱與直接目錄下所對應的包名保持對應,否則編譯無法通過。這樣,GO編譯器就可以從main包所在的目錄開始,完全使用目錄結構和包名來推導工程結構以及構建順序,避免像C++一樣,引入一個額外的Makefile文件。

在GO的編譯過程中,我們唯一要做的就是將GO項目路徑賦值給一個叫GOPATH的環境變數,讓編譯器知道將要編譯的GO項目所在的位置。然後進入bin目錄下,執行go build {主包所在的目錄名},即可秒級完成工程編譯。編譯後的二進位文件,可以推到同類OS上直接運行,沒有任何環境依賴。

GO語言的編程規範強制集成在語言中,比如明確規定花括弧擺放位置,強制要求一行一句,不允許導入沒有使用的包,不允許定義沒有使用的變數,提供gofmt工具強制格式化代碼等等。奇怪的是,這些也引起了很多程序員的不滿,有人發表GO語言的XX條罪狀,裡面就不乏對編程規範的指責。要知道,從工程管理的角度,任何一個開發團隊都會對特定語言制定特定的編程規範,特別像Google這樣的公司,更是如此。GO的設計者們認為,與其將規範寫在文檔裏,還不如強制集成在語言裏,這樣更直接,更有利用團隊協作和工程管理。

API快速開發框架實踐

編程語言是一個工具,它會告訴我們能做什麼,而怎麼做會更好,同樣值得去探討。這部分會介紹用GO語言實現的一個開發框架,以及幾個公共組件。當然,框架和公共組件,其它語言也完全可以實現,而這裡所關注的是成本問題。除此之外,拋開GO語言本身不說,我們也希望可以讓大家從介紹的幾個組件中,得到一些解決問題的思路,那就是通過某種方式,去解決一個面上的問題,而非一味的寫代碼,最終卻只是解決點上的問題。如果你認可這種方式,相信下面的內容也許會影響你之後的項目開發方式,從根本上提高開發效率。

我們為什麼選擇GO語言

選擇GO語言,主要是基於兩方面的考慮

  1. 執行性能 縮短API的響應時長,解決批量請求訪問超時的問題。在Uwork的業務場景下,一次API批量請求,往往會涉及對另外介面服務的多次調用,而在之前的PHP實現模式下,要做到並行調用是非常困難的,串列處理卻不能從根本上提高處理性能。而GO語言不一樣,通過協程可以方便的實現API的並行處理,達到處理效率的最大化。 依賴Golang的高性能HTTP Server,提升系統吞吐能力,由PHP的數百級別提升到數千里甚至過萬級別。
  2. 開發效率 GO語言使用起來簡單、代碼描述效率高、編碼規範統一、上手快。 通過少量的代碼,即可實現框架的標準化,並以統一的規範快速構建API業務邏輯。 能快速的構建各種通用組件和公共類庫,進一步提升開發效率,實現特定場景下的功能量產。

很多人在學習一門新語言或開啟一個新項目時,都會習慣性的是網上找一個認為合適的開源框架來開始自己的項目開發之旅。這樣並沒有什麼不好,但是個人覺得,瞭解它內部的實現對我們會更有幫助。或許大家已經注意到了,所說的MVC框架,其本質上就是對請求路徑進行解析,然後根據請求路徑段,路由到相應的控制器(C)上,再由控制器進一步調用數據邏輯(M),拿到數據後,渲染視圖(V),返回用戶。在整個過程中,核心點在於邏輯的動態調用。

不過,對API框架的實現相對於WEB頁面框架的實現,會更簡單,因為它並不涉及視圖的渲染,只需要將數據結果以協議的方式返回給用戶即可。

使用GO語言實現一套完整的MVC開發框架,是非常容易的,集成HTTP Server的同時,整個框架的核心代碼不會超過300行,從這裡可以實際感受到GO的語言描述效率之高(如果有興趣,可以參考Uwork開源項目seine)。

也有人說,在GO語言中,就沒有框架可言,言外之意是說,引入一個重型的開源框架,必要性並不大,相反還可能把簡單的東西複雜化。

在實際項目開發過程中,只有高效的開發語言還不夠,要想進一步將開發效率擴大化,不斷的沉澱公共基礎庫是必不可少的,以便將通用的基礎邏輯進一步抽象和復用。

除此之外,通用組件能力是實現功能量產的根本,對開發效率會是質的提升。組件化的開發模式會幫忙我們將問題的解決能力從一個點上提升到一個面上。以下會重點介紹幾個通用組件的實現,有了它們的存在,才能真正的解放程序員的生產力。而這些強有力的公共組件在Golang中實現起來並不複雜。同時,結合Golang的並發處理能力,相比於PHP的版本實現,執行效率也會有質的提升。這是組件能力和語言效率的完美結合。

通用列表組件用於所有可能的二維數據源(如MySQL/MongoDB/ES等等)的數據查詢場景,從一個面上解決了數據查詢問題。在Uwork項目開發中,被大量使用,實現數據查詢介面和頁面查詢列表的量產開發。它以一個JSON配置文件為中心,來實現對通用數據源的查詢,並將查詢結果以API或頁面的形式自動返回給用戶。整個過程中幾乎沒有代碼開發,而唯一要做的只是以一種統一的規範編寫配置文件(而不是代碼),真正實現了對數據查詢需求的功能量產。

以上是通用列表組件的構建過程,要實現這樣一個功能強大的通用組件,是不是會給人一種可望而不可及的感覺?其實並非如此,只要理清了它的整個過程,將構建思路融入Golang中,並不是一件複雜的事情。在我們的項目中,整個組件的實現,只用了不到700行Go代碼,就解決了一系列的數據查詢問題。另外,通過Golang的並發特性,實現欄位處理器的並行執行,進一步的提高了組件的執行效率。可以說,通用列表和Golang的融合,是性能和效率的完美結合。

通用表單組件主要用於對資料庫的增、刪、改場景。該組件在Uwork的項目開發中,也有廣泛的應用,與通用列表類似,以一個JSON配置文件為中心,來完成對數據表數據的增、刪、改操作。特別是近期完成的部件級SDB管理平臺,通過通用表單實現了對整個系統的數據維護,通過高度抽象化,做到了業務的無代碼化生產。

以上是通用表單的完整構建過程,而對於這個一個組件的實現,我們用了不到1000行的GO代碼,就解決了對數據表數據維護整個面上的問題。

GO語言本身支持協程並發,協程非常輕量,可以快速啟動成千上萬個協程工作單元。如果對協程任務的數量控制不當,最後的結果很可能適得其反,從而對外部或本身的服務造成不必要的壓力。協程池可以在一定程度上控制執行單元的數量,保證執行的安全性。而在Golang中要實現這樣一個協程池,是非常簡單的,只需要對channel和goroutine稍加封裝,就可以完成,整個構建過程不到80行代碼。

在API開發過程中,數據校驗永遠是必不可或缺的一個環節。如果只是簡單的數據校驗,幾行代碼也許就完成了,可是當遇上複雜的數據校驗時,很可能幾百行的代碼量也未必能完成,特別是遇到遞歸類型的數據校驗,那簡直就是一個噩夢。

數據校驗組件,可以通過一種數據模板的配置方式,使用特定的邏輯來完成通用校驗,開發者只需要配置好相應的數據模板,進行簡單的調用,即可完成整個校驗過程。而對於這樣一個通用性的數據校驗組件,在GO語言中只用了不到700行的代碼量就完成了整個構建。

小結

在實際項目開發過程中,對開發效率提升最大的,無疑是符合系統業務場景的公共組件能力,這點也正好應證了Rob Pike那句話(Less is lessor Less is more),真正的高效率開發,是配置化的,並不需要寫太多的代碼,甚至根本就不需要寫代碼,即可完成邏輯實現,而這種方式對於後期的維護成本也是最優的,因為做到了高度的統一。

GO的語言描述效率毋庸置疑,對上述所有公共組件的實現,均未超過1000行代碼,就解決了某個面上的問題。

搜索關注公眾號「雲加社區」,第一時間獲取技術乾貨,關注後回復1024 送你一份技術課程大禮包!

編輯於 2018-11-26繼續瀏覽內容知乎發現更大的世界打開Chrome繼續茹姐茹姐Go/Java/Python B站:rubyhan1314

鑒於Go語言的特點和設計的初衷,Go語言作為伺服器編程語言,很適合處理日誌、數據打包、虛擬機處理、文件系統、分散式系統、資料庫代理等;網路編程方面,Go語言廣泛應用於Web 應用、API應用、下載應用等;除此之外,Go語言還適用於內存資料庫和雲平臺領域,目前國外很多雲平臺都是採用Go開發。

  • 伺服器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日誌、數據打包、虛擬機處理、文件系統等。
  • 分散式系統、資料庫代理器、中間件等,例如Etcd。
  • 網路編程,這一塊目前應用最廣,包括Web應用、API應用、下載應用,而且Go內置的net/http包基本上把我們平常用到的網路功能都實現了。
  • 資料庫操作
  • 開發雲平臺,目前國外很多雲平臺在採用Go開發

Go發布之後,很多公司特別是雲計算公司開始用Go重構他們的基礎架構,很多都是直接採用Go進行了開發,最近熱火朝天的Docker就是採用Go開發的。

使用 Go 語言開發的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統項目進行C語言庫綁定實現,例如 Qt、Sqlite 等;後期的很多項目都使用 Go 語言進行重新原生實現,這個過程相對於其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發項目的出現。

  • 雲計算基礎設施領域代表項目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛雲存儲等。
  • 基礎軟體代表項目:tidb、influxdb、cockroachdb等。
  • 微服務代表項目:go-kit、micro、monzo bank的typhon、bilibili等。
  • 互聯網基礎設施代表項目:以太坊、hyperledger等。

………………………………………………………於2019.4.22日更…………………………………………………

國內外有哪些企業或項目使用Go語言

Docker

Docker 是一種操作系統層面的虛擬化技術,可以在操作系統和應用程序之間進行隔離,也可以稱之為容器。Docker 可以在一臺物理伺服器上快速運行一個或多個實例。基於lxc的一個虛擬打包工具,能夠實現PAAS平臺的組建。例如,啟動一個 CentOS 操作系統,並在其內部命令行執行指令後結束,整個過程就像自己在操作系統一樣高效。

項目鏈接:

https://github.com/docker/docker?

github.com

go語言

Go 語言自己的早期源碼使用C語言和彙編語言寫成。從 Go 1.5 版本後,完全使用 Go 語言自身進行編寫。Go 語言的源碼對瞭解 Go 語言的底層調度有極大的參考意義,建議希望對 Go 語言有深入瞭解的讀者讀一讀。

項目鏈接:

golang/go?

github.com圖標

Kubernetes

Google 公司開發的構建於 Docker 之上的容器調度服務,用戶可以通過 Kubernetes 集羣進行雲端容器集羣管理。

項目鏈接:

kubernetes/kubernetes?

github.com圖標

etcd

一款分散式、可靠的 KV 存儲系統,可以快速進行雲配置。

項目鏈接:

etcd-io/etcd?

github.com圖標

beego

beego 是一個類似 Python的 Tornado 框架,採用了 RESTFul 的設計思路,使用 Go 語言編寫的一個極輕量級、高可伸縮性和高性能的 Web 應用框架。

項目鏈接:

astaxie/beego?

github.com圖標

martini

一款快速構建模塊化的 Web 應用的 Web 框架。

項目鏈接:

go-martini/martini?

github.com圖標

codis

國產的優秀分散式 Redis 解決方案。

項目鏈接:

https://github.com/CodisLabs/codis?

github.com

delve

Go語言

強大的調試器,被很多集成環境和編輯器整合。

項目鏈接:

go-delve/delve?

github.com圖標

Facebook

Facebook也在用,為此他們還專門在Github上建立了一個開源組織facebookgo,大家可以通過

Facebook Go?

github.com圖標

訪問查看facebook開源的項目,比如著名的是平滑升級的grace。

Uber

騰訊

騰訊作為國內的大公司,還是敢於嘗試的,尤其是Docker容器化這一塊,他們在15年已經做了docker萬臺規模的實踐,具體可以參考

騰訊萬臺規模的Docker應用實踐 - InfoQ?

www.infoq.com

百度

目前所知的百度的使用是在運維這邊,是百度運維的一個BFE項目,負責前端流量的接入。他們的負責人在2016年有分享,大家可以看下這個 。

InfoQ - 促進軟體開發領域知識與創新的傳播?

www.infoq.com

其次就是百度的消息系統。負責公司手百消息通訊系統伺服器端開發及維護。

京東

京東雲消息推送系統、雲存儲,以及京東商城等都有使用Go做開發。

小米

小米對Golang的支持,莫過於運維監控系統的開源,也就是

http://open-falcon.com/?

open-falcon.com

此外,小米互娛、小米商城、小米視頻、小米生態鏈等團隊都在使用Golang。

360

360對Golang的使用也不少,一個是開源的日誌搜索系統Poseidon,託管在Github上,

Qihoo360/poseidon?

github.com圖標

還有360的推送團隊也在使用,他們還寫了篇博文在Golang的官方博客上。

https://blog.golang.org/qihoo?

blog.golang.org

七牛雲

七牛雲用了近50萬行代碼,來實現整個產品。七牛雲存儲產品網址:

七牛雲 - 國內領先的企業級雲服務商?

qiniu.com圖標

上線時間:2011-9-1。應用範圍:整個產品(包括基礎服務、Web端、統計平臺、各類小工具等等)Go代碼行數佔比:99.9%日 PV:保密

美團

美團後臺流量支撐程序。應用範圍:支撐主站後臺流量(排序,推薦,搜索等),提供負載均衡,cache,容錯,按條件分流,統計運行指標(qps,latency)等功能。

滴滴

基礎服務平臺。

金山微看

應用範圍:服務介面,後臺流程服務,消息系統,圖片系統

搜狗

搜狗推送系統。Push系統中用於維持與客戶端連接的部分。

QOR - 模塊化的電商系統

  • QOR官網:

QOR: E-commerce CMS SDK written in Go?

getqor.com

  • github地址: qor/qor · GitHub
  • 應用範圍: 整個產品

weico

產品名:weico 3.0, 服務端所有代碼都是用Go實現。

仙俠道

  • 產品網址:

仙俠道官網 - 心動遊戲?

www.zhihu.com圖標

  • 應用範圍: 遊戲服務端(通訊、邏輯、數據存儲)

快玩遊戲

  • 網址:

快玩小遊戲,單機遊戲,網頁遊戲,快玩遊戲,快玩遊戲盒?

www.zhihu.com圖標

  • 應用範圍:實時消息系統、用戶認證、用戶會話、統一統計介面

盛大雲CDN

  • 網址:盛大雲計算
  • 應用範圍:CDN的調度系統、分發系統、監控系統、短域名服務,CDN內部開放平臺、運營報表系統以及其他一些小工具等

Bmob移動後端雲服務平臺

  • 產品網址:Bmob移動後端雲服務平臺
  • 應用範圍:Restful API(使用Beego)、統計分析平臺、常用服務如發郵件、隊列非同步處理、統計用戶空間和介面請求

羣策

  • 網址:

羣策 - 統一團隊溝通,高效完成工作?

www.zhihu.com圖標

  • 應用範圍:全系統

BiddingX DSP廣告投放系統

  • 網址:BiddingX_專業的DSP解決方案供應商
  • 應用範圍:競價投放、曝光統計、點擊跳轉

街坊四鄰

  • 網址:首頁 - 街坊四鄰
  • 應用範圍:後臺服務

Leanote

  • 網址:Leanote

Bearychat

  • 網址:BearyChat

宅豆

  • 網址:宅豆網 - 自築最美家,宅豆隨你搭

白板- 設計圖討論工具

  • 網址:白板

實驗樓

  • 網址:實驗樓 - 第一家以實驗為核心的IT在線教育平臺

新浪微博

中間件和彈性調度用 Java 和 Go 編寫,微博視頻轉碼及存儲服務用 Go 編寫。

愛奇藝

VR 後臺系統中間件,VR 端的 HTTP 介面。

獵豹移動

消息推送

網易

網易蜂巢容器公有雲。

嗶哩嗶哩

彈幕

巨人網路

部分手機遊戲的服務端。

今日頭條

Nsq:Nsq 是由Go語言開發的高性能、高可用消息隊列系統,性能非常高,每天能處理數十億條的消息;

Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者

Skynet:分散式調度框架

Doozer:分散式同步工具,類似ZooKeeper

Heka:mazila開源的日誌處理系統

Cbfs:couchbase開源的分散式文件系統

Tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣

Groupcache:memcahe作者寫的用於Google下載系統的緩存系統

God:類似redis的緩存系統,但是支持分散式和擴展性

Gor:網路流量抓包和重放工具

還有很多,比如阿里中間件、聚美優品、高升控股、探探、鬥魚直播、人人車、亞信、Udesk、方付通、招財貓、三一集團、美餐網等。一般的選擇,都是選擇用於自己公司合適的產品系統來做,比如消息推送的、監控的、容器的等,Golang特別適合做網路並發的服務,這是他的強項,所以也是被優先用於這些項目。Go語言作為一門大型項目開發語言,在很多大公司相繼使用,甚至完全轉向Go開發。

……………………………………………………更於2019.4.23日………………………………………………

當然,一個技術能不能發展起來,關鍵還要看三點。

1、有沒有一個比較好的社區。

像 C、C++、Java、Python 和 JavaScript 的生態圈都是非常豐富和火爆的。尤其是有很多商業機構參與的社區那就更為人氣爆棚了,比如 Linux 的社區。

2、有沒有一個工業化的標準。

像 C、C++、Java 都是有標準化組織的。尤其是 Java,其在架構上還搞出了像 J2EE 這樣的企業級標準。

3、有沒有一個或多個殺手級應用。

C、C++ 和 Java 的殺手級應用不用多說了,就算是對於 PHP 這樣還不能算是一個好的編程語言來說,因為是 Linux 時代的第一個殺手級解決方案 LAMP 中的關鍵技術,所以,也發展起來了。

上述的這三點是非常關鍵的,新的技術只需要佔到其中一到兩點就已經很不錯了,何況有的技術,比如 Java,是三點全佔到了,所以,Java 的發展是如此好。當然,除了上面這三點重要的,還有一些其它的影響因素,比如:

  • 學習曲線是否低,上手是否快。這點非常重要,C++ 在這點上越做越不好了。
  • 有沒有一個不錯的提高開發效率的開發框架。如:Java 的 Spring 框架,C++ 的 STL 等。
  • 是否有一個或多個巨型的技術公司作為後盾。如:Java 和 Linux 後面的 IBM、Sun……
  • 有沒有解決軟體開發中的痛點。如:Java 解決了 C 和 C++ 的內存管理問題。

用這些標尺來量一下 Go 語言,我們可以清楚地看到:

  • Go 語言容易上手;
  • Go 語言解決了並發編程和寫底層應用開發效率的痛點;
  • Go 語言有 Google 這個世界一流的技術公司在後面;
  • Go 語言的殺手級應用是 Docker,而 Docker 的生態圈在這幾年完全爆棚了。

所以,Go 語言的未來是不可限量的。當然,我個人覺得,Go 可能會吞食很多 C、C++、Java 的項目。不過,Go 語言所吞食主要的項目應該是中間層的項目,既不是非常底層也不會是業務層。

也就是說,Go 語言不會吞食底層到 C 和 C++ 那個級別的,也不會吞食到高層如 Java 業務層的項目。Go 語言能吞食的一定是 PaaS 上的項目,比如一些消息緩存中間件、服務發現、服務代理、控制系統、Agent、日誌收集等等,沒有複雜的業務場景,也到不了特別底層(如操作系統)的中間平臺層的軟體項目或工具。而 C 和 C++ 會被打到更底層,Java 會被打到更上層的業務層。

好了,我們再用上面的標尺來量一下 Go 語言的殺手級應用 Docker,你會發現基本是一樣的。

  • Docker 上手很容易。
  • Docker 解決了運維中的環境問題以及服務調度的痛點。
  • Docker 的生態圈中有大公司在後面助力。比如 Google。
  • Docker 產出了工業界標準 OCI。
  • Docker 的社區和生態圈已經出現像 Java 和 Linux 那樣的態勢。
  • ……

所以,雖然幾年前的 Docker ,當時的坑兒還很多,但是,相對於這些大的因素來說,那些小坑兒都不是問題。只是需要一些時間,這些小坑兒在未來 5-10 年就可以完全被填平了。

同樣,我們可以看到 Kubernetes 作為服務和容器調度的關鍵技術一定會是最後的贏家。


最後,我還要說一下,為什麼要早一點地進入這些新技術,而不是等待這些技術成熟了後再進入。原因有這麼幾個。

技術的發展過程非常重要。因為你可以清楚地看到了這種新技術的生態圈發展過程。讓我們收穫最大的並不是這些技術本身,而是一個技術的變遷和行業的發展。

從中,我們看到了非常具體的各種思潮和思路,這些東西比起 技術本身來說更有價值。因為,這不但讓我們重新思考已經掌握的技術以及如何更好地解決已有的問題,而且還讓我看到了未來。不但有了技術優勢,而且這些知識還讓我們的技術生涯多了很多的可能性。

這些關鍵新技術,可以讓你拿到技術的先機。這些對一個需要技術領導力的個人或公司來說都是非常重要的。

一個公司或是個人能夠佔有技術先機,就會比其它公司或個人有更大的影響力。一旦未來行業需求引爆,那麼這個公司或是個人的影響力就會形成一個比較大的護城河,並可以快速地產生經濟利益。

Go的應用範圍一直在擴大,雲計算,微服務,區塊鏈,哪裡都有用Go寫的重量級項目。docker/kubernetes生態圈,幾百/千萬行代碼,基本統治了雲原生應用市場。去年大熱的區塊鏈,以太坊的geth,比特幣的btcd,閃電網路的lnd,都是Go語言開發。

還是那句話,多看看各種語言的生態,或許都並沒有你想像的那麼不堪。。。Go語言設計上確實不夠「先進」,但也是另一種「務實」。其實go不管在國內還是國外已經很受待見了,國外google用的很多,uber也在用,國內有著名的今日頭條,每日千億級的訪問妥妥的。多少語言終其一生都沒有這麼大的應用場景。


鑒於Go語言的特點和設計的初衷,Go語言作為伺服器編程語言,很適合處理日誌、數據打包、虛擬機處理、文件系統、分散式系統、資料庫代理等;網路編程方面,Go語言廣泛應用於Web 應用、API應用、下載應用等;除此之外,Go語言還適用於內存資料庫和雲平臺領域,目前國外很多雲平臺都是採用Go開發。

  • 伺服器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日誌、數據打包、虛擬機處理、文件系統等。
  • 分散式系統、資料庫代理器、中間件等,例如Etcd。
  • 網路編程,這一塊目前應用最廣,包括Web應用、API應用、下載應用,而且Go內置的net/http包基本上把我們平常用到的網路功能都實現了。
  • 資料庫操作
  • 開發雲平臺,目前國外很多雲平臺在採用Go開發

Go發布之後,很多公司特別是雲計算公司開始用Go重構他們的基礎架構,很多都是直接採用Go進行了開發,最近熱火朝天的Docker就是採用Go開發的。

使用 Go 語言開發的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統項目進行C語言庫綁定實現,例如 Qt、Sqlite 等;後期的很多項目都使用 Go 語言進行重新原生實現,這個過程相對於其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發項目的出現。

  • 雲計算基礎設施領域代表項目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛雲存儲等。
  • 基礎軟體代表項目:tidb、influxdb、cockroachdb等。
  • 微服務代表項目:go-kit、micro、monzo bank的typhon、bilibili等。
  • 互聯網基礎設施代表項目:以太坊、hyperledger等。

………………………………………………………於2019.4.22日更…………………………………………………

國內外有哪些企業或項目使用Go語言

Docker

Docker 是一種操作系統層面的虛擬化技術,可以在操作系統和應用程序之間進行隔離,也可以稱之為容器。Docker 可以在一臺物理伺服器上快速運行一個或多個實例。基於lxc的一個虛擬打包工具,能夠實現PAAS平臺的組建。例如,啟動一個 CentOS 操作系統,並在其內部命令行執行指令後結束,整個過程就像自己在操作系統一樣高效。

項目鏈接:

https://github.com/docker/docker?

github.com

go語言

Go 語言自己的早期源碼使用C語言和彙編語言寫成。從 Go 1.5 版本後,完全使用 Go 語言自身進行編寫。Go 語言的源碼對瞭解 Go 語言的底層調度有極大的參考意義,建議希望對 Go 語言有深入瞭解的讀者讀一讀。

項目鏈接:

golang/go?

github.com圖標

Kubernetes

Google 公司開發的構建於 Docker 之上的容器調度服務,用戶可以通過 Kubernetes 集羣進行雲端容器集羣管理。

項目鏈接:

kubernetes/kubernetes?

github.com圖標

etcd

一款分散式、可靠的 KV 存儲系統,可以快速進行雲配置。

項目鏈接:

etcd-io/etcd?

github.com圖標

beego

beego 是一個類似 Python的 Tornado 框架,採用了 RESTFul 的設計思路,使用 Go 語言編寫的一個極輕量級、高可伸縮性和高性能的 Web 應用框架。

項目鏈接:

astaxie/beego?

github.com圖標

martini

一款快速構建模塊化的 Web 應用的 Web 框架。

項目鏈接:

go-martini/martini?

github.com圖標

codis

國產的優秀分散式 Redis 解決方案。

項目鏈接:

https://github.com/CodisLabs/codis?

github.com

delve

Go語言

強大的調試器,被很多集成環境和編輯器整合。

項目鏈接:

go-delve/delve?

github.com圖標

Facebook

Facebook也在用,為此他們還專門在Github上建立了一個開源組織facebookgo,大家可以通過

Facebook Go?

github.com圖標

訪問查看facebook開源的項目,比如著名的是平滑升級的grace。

Uber

騰訊

騰訊作為國內的大公司,還是敢於嘗試的,尤其是Docker容器化這一塊,他們在15年已經做了docker萬臺規模的實踐,具體可以參考

騰訊萬臺規模的Docker應用實踐 - InfoQ?

www.infoq.com

百度

目前所知的百度的使用是在運維這邊,是百度運維的一個BFE項目,負責前端流量的接入。他們的負責人在2016年有分享,大家可以看下這個 。

InfoQ - 促進軟體開發領域知識與創新的傳播?

www.infoq.com

其次就是百度的消息系統。負責公司手百消息通訊系統伺服器端開發及維護。

京東

京東雲消息推送系統、雲存儲,以及京東商城等都有使用Go做開發。

小米

小米對Golang的支持,莫過於運維監控系統的開源,也就是

http://open-falcon.com/?

open-falcon.com

此外,小米互娛、小米商城、小米視頻、小米生態鏈等團隊都在使用Golang。

360

360對Golang的使用也不少,一個是開源的日誌搜索系統Poseidon,託管在Github上,

Qihoo360/poseidon?

github.com圖標

還有360的推送團隊也在使用,他們還寫了篇博文在Golang的官方博客上。

https://blog.golang.org/qihoo?

blog.golang.org

七牛雲

七牛雲用了近50萬行代碼,來實現整個產品。七牛雲存儲產品網址:

七牛雲 - 國內領先的企業級雲服務商?

qiniu.com圖標

上線時間:2011-9-1。應用範圍:整個產品(包括基礎服務、Web端、統計平臺、各類小工具等等)Go代碼行數佔比:99.9%日 PV:保密

美團

美團後臺流量支撐程序。應用範圍:支撐主站後臺流量(排序,推薦,搜索等),提供負載均衡,cache,容錯,按條件分流,統計運行指標(qps,latency)等功能。

滴滴

基礎服務平臺。

金山微看

應用範圍:服務介面,後臺流程服務,消息系統,圖片系統

搜狗

搜狗推送系統。Push系統中用於維持與客戶端連接的部分。

QOR - 模塊化的電商系統

  • QOR官網:

QOR: E-commerce CMS SDK written in Go?

getqor.com

  • github地址: qor/qor · GitHub
  • 應用範圍: 整個產品

weico

產品名:weico 3.0, 服務端所有代碼都是用Go實現。

仙俠道

  • 產品網址:

仙俠道官網 - 心動遊戲?

www.zhihu.com圖標

  • 應用範圍: 遊戲服務端(通訊、邏輯、數據存儲)

快玩遊戲

  • 網址:

快玩小遊戲,單機遊戲,網頁遊戲,快玩遊戲,快玩遊戲盒?

www.zhihu.com圖標

  • 應用範圍:實時消息系統、用戶認證、用戶會話、統一統計介面

盛大雲CDN

  • 網址:盛大雲計算
  • 應用範圍:CDN的調度系統、分發系統、監控系統、短域名服務,CDN內部開放平臺、運營報表系統以及其他一些小工具等

Bmob移動後端雲服務平臺

  • 產品網址:Bmob移動後端雲服務平臺
  • 應用範圍:Restful API(使用Beego)、統計分析平臺、常用服務如發郵件、隊列非同步處理、統計用戶空間和介面請求

羣策

  • 網址:

羣策 - 統一團隊溝通,高效完成工作?

www.zhihu.com圖標

  • 應用範圍:全系統

BiddingX DSP廣告投放系統

  • 網址:BiddingX_專業的DSP解決方案供應商
  • 應用範圍:競價投放、曝光統計、點擊跳轉

街坊四鄰

  • 網址:首頁 - 街坊四鄰
  • 應用範圍:後臺服務

Leanote

  • 網址:Leanote

Bearychat

  • 網址:BearyChat

宅豆

  • 網址:宅豆網 - 自築最美家,宅豆隨你搭

白板- 設計圖討論工具

  • 網址:白板

實驗樓

  • 網址:實驗樓 - 第一家以實驗為核心的IT在線教育平臺

新浪微博

中間件和彈性調度用 Java 和 Go 編寫,微博視頻轉碼及存儲服務用 Go 編寫。

愛奇藝

VR 後臺系統中間件,VR 端的 HTTP 介面。

獵豹移動

消息推送

網易

網易蜂巢容器公有雲。

嗶哩嗶哩

彈幕

巨人網路

部分手機遊戲的服務端。

今日頭條

Nsq:Nsq 是由Go語言開發的高性能、高可用消息隊列系統,性能非常高,每天能處理數十億條的消息;

Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者

Skynet:分散式調度框架

Doozer:分散式同步工具,類似ZooKeeper

Heka:mazila開源的日誌處理系統

Cbfs:couchbase開源的分散式文件系統

Tsuru:開源的PAAS平臺,和SAE實現的功能一模一樣

Groupcache:memcahe作者寫的用於Google下載系統的緩存系統

God:類似redis的緩存系統,但是支持分散式和擴展性

Gor:網路流量抓包和重放工具

還有很多,比如阿里中間件、聚美優品、高升控股、探探、鬥魚直播、人人車、亞信、Udesk、方付通、招財貓、三一集團、美餐網等。一般的選擇,都是選擇用於自己公司合適的產品系統來做,比如消息推送的、監控的、容器的等,Golang特別適合做網路並發的服務,這是他的強項,所以也是被優先用於這些項目。Go語言作為一門大型項目開發語言,在很多大公司相繼使用,甚至完全轉向Go開發。

……………………………………………………更於2019.4.23日………………………………………………

當然,一個技術能不能發展起來,關鍵還要看三點。

1、有沒有一個比較好的社區。

像 C、C++、Java、Python 和 JavaScript 的生態圈都是非常豐富和火爆的。尤其是有很多商業機構參與的社區那就更為人氣爆棚了,比如 Linux 的社區。

2、有沒有一個工業化的標準。

像 C、C++、Java 都是有標準化組織的。尤其是 Java,其在架構上還搞出了像 J2EE 這樣的企業級標準。

3、有沒有一個或多個殺手級應用。

C、C++ 和 Java 的殺手級應用不用多說了,就算是對於 PHP 這樣還不能算是一個好的編程語言來說,因為是 Linux 時代的第一個殺手級解決方案 LAMP 中的關鍵技術,所以,也發展起來了。

上述的這三點是非常關鍵的,新的技術只需要佔到其中一到兩點就已經很不錯了,何況有的技術,比如 Java,是三點全佔到了,所以,Java 的發展是如此好。當然,除了上面這三點重要的,還有一些其它的影響因素,比如:

  • 學習曲線是否低,上手是否快。這點非常重要,C++ 在這點上越做越不好了。
  • 有沒有一個不錯的提高開發效率的開發框架。如:Java 的 Spring 框架,C++ 的 STL 等。
  • 是否有一個或多個巨型的技術公司作為後盾。如:Java 和 Linux 後面的 IBM、Sun……
  • 有沒有解決軟體開發中的痛點。如:Java 解決了 C 和 C++ 的內存管理問題。

用這些標尺來量一下 Go 語言,我們可以清楚地看到:

  • Go 語言容易上手;
  • Go 語言解決了並發編程和寫底層應用開發效率的痛點;
  • Go 語言有 Google 這個世界一流的技術公司在後面;
  • Go 語言的殺手級應用是 Docker,而 Docker 的生態圈在這幾年完全爆棚了。

所以,Go 語言的未來是不可限量的。當然,我個人覺得,Go 可能會吞食很多 C、C++、Java 的項目。不過,Go 語言所吞食主要的項目應該是中間層的項目,既不是非常底層也不會是業務層。

也就是說,Go 語言不會吞食底層到 C 和 C++ 那個級別的,也不會吞食到高層如 Java 業務層的項目。Go 語言能吞食的一定是 PaaS 上的項目,比如一些消息緩存中間件、服務發現、服務代理、控制系統、Agent、日誌收集等等,沒有複雜的業務場景,也到不了特別底層(如操作系統)的中間平臺層的軟體項目或工具。而 C 和 C++ 會被打到更底層,Java 會被打到更上層的業務層。

好了,我們再用上面的標尺來量一下 Go 語言的殺手級應用 Docker,你會發現基本是一樣的。

  • Docker 上手很容易。
  • Docker 解決了運維中的環境問題以及服務調度的痛點。
  • Docker 的生態圈中有大公司在後面助力。比如 Google。
  • Docker 產出了工業界標準 OCI。
  • Docker 的社區和生態圈已經出現像 Java 和 Linux 那樣的態勢。
  • ……

所以,雖然幾年前的 Docker ,當時的坑兒還很多,但是,相對於這些大的因素來說,那些小坑兒都不是問題。只是需要一些時間,這些小坑兒在未來 5-10 年就可以完全被填平了。

同樣,我們可以看到 Kubernetes 作為服務和容器調度的關鍵技術一定會是最後的贏家。


最後,我還要說一下,為什麼要早一點地進入這些新技術,而不是等待這些技術成熟了後再進入。原因有這麼幾個。

技術的發展過程非常重要。因為你可以清楚地看到了這種新技術的生態圈發展過程。讓我們收穫最大的並不是這些技術本身,而是一個技術的變遷和行業的發展。

從中,我們看到了非常具體的各種思潮和思路,這些東西比起 技術本身來說更有價值。因為,這不但讓我們重新思考已經掌握的技術以及如何更好地解決已有的問題,而且還讓我看到了未來。不但有了技術優勢,而且這些知識還讓我們的技術生涯多了很多的可能性。

這些關鍵新技術,可以讓你拿到技術的先機。這些對一個需要技術領導力的個人或公司來說都是非常重要的。

一個公司或是個人能夠佔有技術先機,就會比其它公司或個人有更大的影響力。一旦未來行業需求引爆,那麼這個公司或是個人的影響力就會形成一個比較大的護城河,並可以快速地產生經濟利益。

Go的應用範圍一直在擴大,雲計算,微服務,區塊鏈,哪裡都有用Go寫的重量級項目。docker/kubernetes生態圈,幾百/千萬行代碼,基本統治了雲原生應用市場。去年大熱的區塊鏈,以太坊的geth,比特幣的btcd,閃電網路的lnd,都是Go語言開發。

還是那句話,多看看各種語言的生態,或許都並沒有你想像的那麼不堪。。。Go語言設計上確實不夠「先進」,但也是另一種「務實」。其實go不管在國內還是國外已經很受待見了,國外google用的很多,uber也在用,國內有著名的今日頭條,每日千億級的訪問妥妥的。多少語言終其一生都沒有這麼大的應用場景。


可能習慣了Java的方式到Go確實有點不適應,反過來也會一樣。

Java語言本身(不是JVM,沒哪個VM不複雜的,除了Lua)並不複雜,複雜的是他的那些框架和庫,學Java語言本身可能只要一週,學那些庫和框架可能要你三個月。他們封裝了很多東西,讓你習慣之後可以按固定套路很快建起東西來,你的關注點會在框架而不是語言本身上。這是缺點也是優點。

Go對於框架和庫和態度不太一樣,你發現Go上根本沒有如SSH那種風格的東西,它鼓勵的是簡單、清晰的package,不要總想著去搞那N層的抽象,一上手就各種介面、基類鎮樓。想當年,剛開始用Python時我就是那樣的,很快發現思路不對。

你需要的是轉換思路,研究一個Go的開源項目,比如groupcache,就明白怎麼玩了。Go上沒有許多的框架給你用,因為很多人認為用不著,標準庫、流行的第三方庫80%的情況下夠用,剩下20%不是多數人考慮的範圍。Go這種風格確實不如Java寫業務代碼方便,但如果沒辦法的話,建議你盡量去適應它。

我們用Go做伺服器(整體系統微服務化,業務複雜度一般,但要求24x7運行不能停,不能出錯),也做工控機上的程序(配合C寫的,同樣要求24x7不能出錯),還做一些順手的管理工具。與資料庫打交道多的部分我們還是用Python,ORM配合動態語言實在出活快。


我是go超級愛好者和支持者。另外工作上主要還是以java為主(沒辦法,公司規定)

=============以下是go吹部分,純吹,非戰鬥人員請撤離===============

1.性能好

golang最大的優勢就是處理高並發請求佔用資源非常小(goroutine的優勢),並且編寫對應並發程序以及日後的維護也非常容易。

所以小米的搶購,滴滴的很多服務,還有b站的很多服務, 還有許多許多公司的高並發相關的服務(無論國內國外)都轉用golang重寫,即省機器日後維護又方便還可以向公司領導邀功。網上應該都能搜到這些公司的技術文章,轉用golang重寫基本上都能省60%以上的機器資源,而且代碼真的簡潔明瞭。 現在很多遊戲公司也使用golang來實現遊戲服務端。

2. KISS

golang語法上拋棄了繼承並且最佳實踐裏不建議使用設計模式。我覺得相對於java這是一個我非常非常喜歡的東西。golang的設計理念和unix的設計理念相同(因為創始人一樣),KISS (Keep It Simple ,Stupid)。

我不清楚別人什麼情況,我是超級討厭java那種封裝800層的處理方式,看別人代碼的時候,經常會看到繼承地獄和各種設計模式的結合,一層一層的點進去,再繞幾個設計模式,真的要死的感覺。java代碼會寫成這樣經常是因為要"重用性和可拓展性",最後卻丟了可維護性, 說好的「高內聚,低耦合」呢?

golang相對來說從各方面鼓勵程序員不要做大而全的東西,要做小並且簡單的東西,然後這些小並且簡單的東西串起來實現具體需求。具體有哪些方面?

介面,golang鼓勵程序員在實現功能之前自己抽象好各個介面

方便的模塊間通信,golang的io庫極好用並且go有很好用的並發解決方案

極方便的測試用例方案,這個簡直甩junit幾萬條街

所以如果按這些原則,工作也極好分配,介面模塊抽象出來了,把模塊向每個人一分,每個人保證測試用例沒問題,模塊之間介面一對接就OK了, 並且由於每個模塊都非常小,還可以非常方便的寫測試用例,出問題的概率也低了,即使出了問題,定位也會非常迅速。

還有就是用java做東西的時候,幾乎必先學框架, web有servlet, jsp, jstl, tomcat, jetty, ssh, 以及各種「好用的」東西, 高性能網路處理要學netty,甚至有些人說學過java不學netty等於白學的說法。表面上這些框架聽著很方便,口碑也很好,但每個框架都是有其學習成本以及各種坑!各種坑!各種坑!框架還會出現漏洞,框架用的越多,風險也就越大,struts2的漏洞當年可是非常有名啊。

3.golang其實非常好上手

不像java的各種框架,你需要對應學這些框架很多專門的東西。對於golang語言本身,大部分是隻要你懂協議,你就可以上手寫代碼了。

你懂http協議?java你還要學servlet, jsp, jstl, tomcat, tomcat調優, jetty, jetty調優,SSH,才能實現一個產品級的http服務。golang的話,按需求寫代碼,然後編譯出來可執行文件就行了。

你懂tcp/ip? java你要學netty,理解netty裏專有的各種概念(Channel, ChannelPipeline, ChannelHandler, ChannelHandlerContext, ChannelFuture, ChannelPromise),理解netty的用法,熟悉netty的各種坑, 各種網上搜netty原理解析,最後看看netty源碼,就可以實現傳說中的能承載高並發的伺服器。golang的話,按需求寫代碼,然後編譯出來可執行文件就行了。我曾經用netty和golang實現過相同的功能,相比之下golang的代碼非常直觀,而netty的話,你在會使用netty的情況下思路還要繞幾下才能明白你是如何實現這個功能的, 因為你在netty的架子下。

最後golang大法好!匿名防噴~


推薦閱讀:
相關文章