比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語言入門教程中的一小段程式碼:
如果你是一個新手,看到這段程式碼你並不會感到吃驚。它展示了多種賦值、資料結構、指標、格式化以及內建的 HTTP 庫。
當我第一次程式設計時,我很喜歡使用 Python 的高階功能。Python 允許你創造性地使用正在編寫的程式碼,比如,你可以:
-
在程式碼初始化時,使用 MetaClasses 自行註冊類別
-
置換真假
-
新增函式到內建函式列表中
-
透過奇妙的方法過載運算子
毋庸置疑這些程式碼很有趣,但也使得在讀取其他人的工作時,程式碼變得難以理解。
Go 強迫你堅持打牢基礎,這也就為讀取任意程式碼帶來了便利,並能很快搞明白當下發生的事情。
4
併發性&通道
Go 作為一門語言致力於使事情簡單化。它並未引入很多新概念,而是聚焦於打造一門簡單的語言,它使用起來異常快速並且簡單。其唯一的創新之處是 goroutines 和通道。Goroutines 是 Go 面向執行緒的輕量級方法,而通道是 goroutines 之間通訊的優先方式。
建立 Goroutines 的成本很低,只需幾千個位元組的額外記憶體,正由於此,才使得同時執行數百個甚至數千個 goroutines 成為可能。你可以藉助通道實現 goroutines 之間的通訊。Go 執行時間可以表示所有的複雜性。Goroutines 以及基於通道的併發性方法使其非常容易使用所有可用的 CPU 核心,並處理併發的 IO——所有不帶有複雜的開發。相較於 Python/Java,在一個 goroutine 上執行一個函式需要最小的樣板程式碼。你只需使用關鍵詞「go」新增函式呼叫:
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語言的看法!
熱 文 推 薦
☞ 從Java小白到收穫BAT等offer,分享我這兩年的經驗和感悟
公眾號【程式設計師江湖】裡有什麼?
1.每天 早上九點 分享一篇 程式設計師乾貨文章 ,包括但不限於 技術乾貨、求職攻略、學習方法、成長經驗、生活感悟 等方面的內容。
2.關注 公眾號 後,後臺回覆“資料”即可獲得 3T 海量學習資料,資料涵蓋各個技術方向,包括Java、C++、前端、大資料、移動開發等方向。每個方向都包含了基礎、進階、求職等內容。
3.關注 公眾號 後,後臺回覆“加群”即可加入我們的 程式設計師專屬微信群(目前有 程式設計師江湖大群、 Java等方向的技術交流群、春招實習交流群等)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2565073/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- golang程式設計師前景怎麼樣?Python、Java、go語言的優勢互比Golang程式設計師PythonJava
- 【Python】Python 對比 C語言的差異PythonC語言
- Python、 JAVA這種語言比較火,是不是C語言就不行了PythonJavaC語言
- Go語言實現的Java Stream APIGoJavaAPI
- 再見,Python!你好,Go語言PythonGo
- Java和Python哪個更好?解讀Python對比其他語言的優勢JavaPython
- 效能對比 Go、Python、PHP、C/C++、C# .Net、Java、Node.js、… 等多程式語言GoPythonPHPC++C#JavaNode.js
- Go語言————1、初識GO語言Go
- Python和Java、PHP、C、C#、C++等其他語言的對比?PythonJavaPHPC#C++
- Java Go python 執行速度對比JavaGoPython
- Go語言的”坑“Go
- go語言的介面Go
- go語言與c語言的相互呼叫GoC語言
- GO語言————2、GO語言環境安裝Go
- Java和Go語言二選一,選擇哪門語言好?JavaGo
- 【Go 語言入門專欄】Go 語言的起源與發展Go
- Go vs Java vs C# 語法對比GoJavaC#
- Go語言版本的forgeryGo
- Go語言的前景分析Go
- Go語言的那些坑Go
- 【Go語言入門系列】(八)Go語言是不是面嚮物件語言?Go物件
- Go_go語言初探Go
- Java、Python到底誰是最好的程式語言?JavaPython
- 初學程式語言,選擇python和Java哪個比較合適?PythonJava
- Go語言mapGo
- go 語言切片Go
- go 語言常量Go
- go語言使用Go
- 比原鏈CTO James | Go語言成為區塊鏈主流開發語言的四點理由Go區塊鏈
- Go是Google的語言,而不是我們的語言Go
- 【建造者設計模式詳解】Java/JS/Go/Python/TS不同語言實現設計模式JavaJSGoPython
- 【橋接設計模式詳解】Java/JS/Go/Python/TS不同語言實現橋接設計模式JavaJSGoPython
- 【命令設計模式詳解】C/Java/JS/Go/Python/TS不同語言實現設計模式JavaJSGoPython
- GO語言————8.5 map 的排序Go排序
- Go語言的互斥鎖MutexGoMutex
- Go 語言的組合之道Go
- go語言的31個坑Go
- go語言json的使用技巧GoJSON