比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 之間的基準比較:



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("http://api.openweathermap.org/data/2.5/weather?APPID=YOUR_API_KEY&q=" + city) 

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.    }


如果你是一個新手,看到這段代碼你並不會感到吃驚。它展示了多種賦值、數據結構、指針、格式化以及內置的 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")}


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


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


5

快速的編譯時間

當前我們使用 Go 編寫的最大微服務的編譯時間只需 6 秒。相較於 Java 和 C++呆滯的編譯速度,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語言學習筆記》



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


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


2

《Go語言實戰》



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


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


3

《Go Web編程》



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


適合人羣:全覆蓋


4

《Go語言編程》



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


適合人羣:全覆蓋,側重有經驗的程序員


5

《Go併發編程實戰(第2版)》 



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


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


6

《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語言的看法!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章