比Python、Java更快的 Go 語言,能否稱霸江湖?

a724888發表於2019-01-28


關注之後加星標,江湖要事早知道



比Python、Java更快的 Go 語言,能否稱霸江湖?

文章來源:jb51.net


有一種語言堪稱比語言排行榜前五熱門選手的Python、Java更快,它就是GO語言。


Go於2009年11月正式宣佈推出,成為開放原始碼專案,並在Linux及Mac OS X平臺上進行了實現,後來追加了Windows系統下的實現。在2016年,Go被軟體評價公司TIOBE 選為“TIOBE2016 年最佳語言”。 目前,Go每半年釋出一個二級版本(即從a.x升級到a.y)。


在Go語言面世後的9年,有很多公司開始使用Go語言開發自己的服務,甚至完全轉向Go開發,也誕生了很多基於Go的服務和應用,比如Dokcer、k8s等,很多的大公司也在用,比如google(作為開發Go語言的公司,當仁不讓)、Facebook、騰訊、百度、阿里、京東、小米以及360。


有人稱:“Go 是網際網路時代的C語言,不僅會制霸雲端計算,10 年內將會制霸整個 IT 領域。”那麼,Go語言真的會制霸IT界嗎?我們一起來了解一下這位“新秀”選手。



1

GO語言的優勢


1

效能


Go 極其地快。其效能與 Java 或 C++相似。在我們的使用中,Go 一般比 Python 要快 30 倍。以下是 Go 與 Java 之間的基準比較:


比Python、Java更快的 Go 語言,能否稱霸江湖?


2

語言效能很重要

對很多應用來說,程式語言只是簡單充當了其與資料集之間的膠水。語言本身的效能常常無關輕重。

但是 Stream 是一個 API 提供商,服務於世界 500 強以及超過 2 億的終端使用者。數年來我們已經最佳化了 Cassandra、PostgreSQL、Redis 等等,然而最終抵達了所使用語言的極限。


Python 非常棒,但是其在序列化/去序列化、排序和聚合中表現欠佳。我們經常會遇到這樣的問題:Cassandra 用時 1ms 檢索了資料,Python 卻需要 10ms 將其轉化成物件。



3

開發者效率&過於創新

看一下絕佳的GO語言入門教程中的一小段程式碼:

1. package main 
2. type openWeatherMap struct{}func (w openWeatherMap) temperature(city string) (float64, error) { 
3.    resp, err := http.Get(") 
4.    if err != nil { 
5.        return 0, err 
6.    } 
7.    defer resp.Body.Close() 
8.    var d struct { 
9.        Main struct { 
10.            Kelvin float64 `json:"temp"` 
11.        } `json:"main"` 
12.    } 
13.    if err := json.NewDecoder(resp.Body).Decode(&d); err != nil { 
14.        return 0, err 
15.    }
比Python、Java更快的 Go 語言,能否稱霸江湖?


如果你是一個新手,看到這段程式碼你並不會感到吃驚。它展示了多種賦值、資料結構、指標、格式化以及內建的 HTTP 庫。

當我第一次程式設計時,我很喜歡使用 Python 的高階功能。Python 允許你創造性地使用正在編寫的程式碼,比如,你可以:

  • 在程式碼初始化時,使用 MetaClasses 自行註冊類別

  • 置換真假

  • 新增函式到內建函式列表中

  • 透過奇妙的方法過載運算子

毋庸置疑這些程式碼很有趣,但也使得在讀取其他人的工作時,程式碼變得難以理解。

Go 強迫你堅持打牢基礎,這也就為讀取任意程式碼帶來了便利,並能很快搞明白當下發生的事情。


4

併發性&通道

Go 作為一門語言致力於使事情簡單化。它並未引入很多新概念,而是聚焦於打造一門簡單的語言,它使用起來異常快速並且簡單。其唯一的創新之處是 goroutines 和通道。Goroutines 是 Go 面向執行緒的輕量級方法,而通道是 goroutines 之間通訊的優先方式。

建立 Goroutines 的成本很低,只需幾千個位元組的額外記憶體,正由於此,才使得同時執行數百個甚至數千個 goroutines 成為可能。你可以藉助通道實現 goroutines 之間的通訊。Go 執行時間可以表示所有的複雜性。Goroutines 以及基於通道的併發性方法使其非常容易使用所有可用的 CPU 核心,並處理併發的 IO——所有不帶有複雜的開發。相較於 Python/Java,在一個 goroutine 上執行一個函式需要最小的樣板程式碼。你只需使用關鍵詞「go」新增函式呼叫:

1. package main 
2. import ( 
3.    "fmt" 
4.    "time")func say(s string) { 
5.    for i := 0; i < 5; i++ { 
6.        time.Sleep(100 * time.Millisecond) 
7.        fmt.Println(s) 
8.    }}func main() { 
9.    go say("world") 
10.    say("hello")}
比Python、Java更快的 Go 語言,能否稱霸江湖?


Go 的併發性方法非常容易上手,相較於 Node 也很有趣;在 Node 中,開發者必須密切關注非同步程式碼的處理。


併發性的另一個優質特性是競賽檢測器,這使其很容易弄清楚非同步程式碼中是否存在競態條件。


5

快速的編譯時間

當前我們使用 Go 編寫的最大微服務的編譯時間只需 6 秒。相較於 Java 和 C++呆滯的編譯速度,Go 的快速編譯時間是一個主要的效率優勢。我熱愛擊劍,但是當我依然記得程式碼應該做什麼之時,事情已經完成就更好了。

比Python、Java更快的 Go 語言,能否稱霸江湖?



6

打造團隊的能力

首先,最明顯的一點是:Go 的開發者遠沒有 C++和 Java 等舊語言多。據知,有 38% 的開發者瞭解 Java,19.3% 的開發者瞭解 C++,只有 4.6% 的開發者知道 Go。GitHub 資料表明了相似的趨勢:相較於 Erlang、Scala 和 Elixir,Go 更為流行,但是相較於 Java 和 C++ 就不是了。


幸運的是 Go 非常簡單,且易於學習。它只提供了基本功能而沒有多餘。Go 引入的新概念是「defer」宣告,以及內建的帶有 goroutines 和通道的併發性管理。正是由於 Go 的簡單性,任何的 Python、Elixir、C++、Scala 或者 Java 開發者皆可在一月內組建成一個高效的 Go 團隊。



7

強大的生態系統

對我們這麼大小的團隊(大約 20 人)而言,生態系統很重要。如果你需要重做每塊功能,那就無法為客戶創造收益了。Go 有著強大的工具支援,面向 Redis、RabbitMQ、PostgreSQL、Template parsing、Task scheduling、Expression parsing 和 RocksDB 的穩定的庫。

Go 的生態系統相比於 Rust、Elixir 這樣的語言有很大的優勢。當然,它又略遜於 Java、Python 或 Node 這樣的語言,但它很穩定,而且你會發現在很多基礎需求上,已經有高質量的檔案包可用了。


8

GOFMT,強制程式碼格式

Gofmt 是一種強大的命令列功能,內建在 Go 的編譯器中來規定程式碼的格式。從功能上看,它類似於 Python 的 autopep8。格式一致很重要,但實際的格式標準並不總是非常重要。Gofmt 用一種官方的形式規格程式碼,避免了不必要的討論。


9

gRPC和Protocol Buffres

Go 語言對 protocol buffers 和 gRPC 有一流的支援。這兩個工具能一起友好地工作以構建需要透過 RPC 進行通訊的微伺服器(microservices)。我們只需要寫一個清單(manifest)就能定義 RPC 呼叫發生的情況和引數,然後從該清單將自動生成伺服器和客戶端程式碼。這樣產生程式碼不僅快速,同時網路佔用也非常少。

從相同的清單,我們可以從不同的語言生成客戶端程式碼,例如 C++、Java、Python 和 Ruby。因此內部通訊的 RESET 端點不會產生分歧,我們每次也就需要編寫幾乎相同的客戶端和伺服器程式碼。



2

不足之處


1

缺少框架

Go 語言沒有一個主要的框架,如 Ruby 的 Rails 框架、Python 的 Django 框架或 PHP 的 Laravel。這是 Go 語言社群激烈討論的問題,因為許多人認為我們不應該從使用框架開始。在很多案例情況中確實如此,但如果只是希望構建一個簡單的 CRUD API,那麼使用 Django/DJRF、Rails Laravel 或 Phoenix 將簡單地多。


2

錯誤處理

Go 語言透過函式和預期的呼叫程式碼簡單地返回錯誤(或返回撥用堆疊)而幫助開發者處理編譯報錯。雖然這種方法是有效的,但很容易丟失錯誤發生的範圍,因此我們也很難向使用者提供有意義的錯誤資訊。錯誤包(errors package)可以允許我們新增返回錯誤的上下文和堆疊追蹤而解決該問題。

另一個問題是我們可能會忘記處理報錯。諸如 errcheck 和 megacheck 等靜態分析工具可以避免出現這些失誤。雖然這些解決方案十分有效,但可能並不是那麼正確的方法。


3

軟體包管理

Go 語言的軟體包管理絕對不是完美的。預設情況下,它沒有辦法制定特定版本的依賴庫,也無法建立可複寫的 builds。相比之下 Python、Node 和 Ruby 都有更好的軟體包管理系統。然而透過正確的工具,Go 語言的軟體包管理也可以表現得不錯。

我們可以使用 Dep 來管理依賴項,它也能指定特定的軟體包版本。除此之外,我們還可以使用一個名為 VirtualGo 的開源工具,它能輕鬆地管理 Go 語言編寫的多個專案。

3

推薦書籍


1

《Go語言學習筆記》


比Python、Java更快的 Go 語言,能否稱霸江湖?


推薦理由: 作為時下流行的一種系統程式語言,Go 簡單易學,效能很好,且支援各類主流平臺。已有大量專案採用 Go 編寫,這其中就包括 Docker 等明星作品,其開發和執行效率早已被證明。本書經四年多逐步完善,內容覆蓋了語言、執行時、效能最佳化、工具鏈等各層面知識。且內容經大量讀者反饋和校對,沒有明顯的缺陷和錯誤。


適合人群: 本書不適合程式設計初學入門,可供有實際程式設計經驗或正在使用Go 工作的人群參考。


2

《Go語言實戰》


比Python、Java更快的 Go 語言,能否稱霸江湖?


推薦理由 :William Kennedy是一位熟練的軟體開發者,也是部落格GoingGo.Net的作者。本書向讀者提供一個專注、全面且符合語言習慣的視角。Go語言實戰同時關注語言的規範和實現,涉及的內容包括語法、型別系統、併發、管道、測試,以及其他一些主題。


適合人群: 全覆蓋,側重初學者


3

《Go Web程式設計》


比Python、Java更快的 Go 語言,能否稱霸江湖?


推薦理由:  《Go Web程式設計》介紹如何用Go語言進行Web應用的開發,將Go語言的特性與Web開發實戰組合到一起,幫讀者成功地構建跨平臺的應用程式,節省Go語言開發Web的寶貴時間。有了這些針對真實問題的解決方案放在手邊,大多數程式設計難題都會迎刃而解,讀者可以更加方便地找到各種程式設計問題的解決方案,內容涵蓋文字處理、表單處理、Session管理、資料庫互動、加/解密、國際化和標準化,以及程式的部署維護等運維方面的知識,最後還介紹了一個快速開發的框架幫助您迅速進入Go語言的Web開發。


適合人群: 全覆蓋


4

《Go語言程式設計》


比Python、Java更快的 Go 語言,能否稱霸江湖?


推薦理由: 作者是業界大神級別的人物,七牛雲端儲存團隊的核心技術人員,也是國內最早應用和推廣 Go 語言技術的專家!本書內容簡煉,重點突出,將 Go 語言的特性做了充分的分析和總結,並給出 Go 例項的程式碼;內容體系可能更適合有一定程式設計基礎的程式設計師閱讀!本書是國內最早的中文版的 Go 技術書籍之一,雖然發行時間比較早,但仍可以作為重要參考!電子版和紙質版都有!


適合人群: 全覆蓋,側重有經驗的程式設計師


5

《Go併發程式設計實戰(第2版)》  


比Python、Java更快的 Go 語言,能否稱霸江湖?


推薦理由: 本書首先介紹了Go語言的優秀特性、安裝設定方法、工程結構、標準命令和工具、語法基礎、資料型別以及流程控制方法,接著闡述了與多程式程式設計和多執行緒程式設計有關的知識,然後重點介紹了goroutine、channel以及Go提供的傳統同步方法,最後透過一個完整例項——網路爬蟲框架進一步闡述Go語言的哲學和理念,同時分享作者在多年程式設計生涯中的一些見解和感悟。


適合人群: 適用於有一定計算機程式設計基礎的從業者以及對Go語言程式設計感興趣的愛好者,非常適合作為Go語言程式設計進階教程。


6

《Go 語言程式設計》


比Python、Java更快的 Go 語言,能否稱霸江湖?


推薦理由: 國外最經典的Go語言著作,Go語言程式設計的先驅者Mark Summerfield的實踐經驗總結。這是一本Go語言實戰指南,幫你瞭解Go語言,按Go語言的方式思考,以及使用Go語言來編寫高效能軟體。


作者展示瞭如何編寫充分利用Go語言突破性的特性和慣用法的程式碼,以及Go語言在其他語言之上所做的改進,並著重強調了Go語言的關鍵創新。注重實踐教學,每章都提供了多個經過精心設計的程式碼示例。由國內第一個核心服務完全採用Go語言實現的團隊——七牛團隊核心成員翻譯。


適合人群: 適用於有一定Go語言程式設計程式設計的愛好者,非常適合作為Go語言程式設計進階教程。



4

最後


Go 是一種非常高效的語言,高度支援併發性。同時,它也像 C++和Java 一樣快。雖然相比於 Python 和 Ruby,使用 Go 建立東西需要更多的時間,但在後續的程式碼最佳化上可以節省大量時間。


對新手開發者而言,Go 結合了強大的生態系統、易於上手,也有超快的表現、高度支援併發性,富有成效的程式設計環境使它成為了一種好的選擇。


你掌握Go語言了嗎?留言說說你對Go語言的看法!



 熱 文  推 薦 

☞  從Java小白到收穫BAT等offer,分享我這兩年的經驗和感悟

☞  校招前幾個月,如何高效地進行復習?

☞  刷完500道BAT面試題,我能去面試大廠了嗎?


公眾號【程式設計師江湖】裡有什麼?

1.每天 早上九點 分享一篇 程式設計師乾貨文章 ,包括但不限於 技術乾貨、求職攻略、學習方法、成長經驗、生活感悟 等方面的內容。


2.關注 公眾號 後,後臺回覆“資料”即可獲得 3T 海量學習資料,資料涵蓋各個技術方向,包括Java、C++、前端、大資料、移動開發等方向。每個方向都包含了基礎、進階、求職等內容。


3.關注 公眾號 後,後臺回覆“加群”即可加入我們的 程式設計師專屬微信群(目前有 程式設計師江湖大群、 Java等方向的技術交流群、春招實習交流群等)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2565073/,如需轉載,請註明出處,否則將追究法律責任。

相關文章