佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 我放棄Python轉(zhuǎn)Go語言的9大理由(附優(yōu)秀書籍推薦)

我放棄Python轉(zhuǎn)Go語言的9大理由(附優(yōu)秀書籍推薦)

熱門標(biāo)簽:Linux服務(wù)器 AI電銷 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) 呼叫中心市場需求 地方門戶網(wǎng)站 服務(wù)外包 百度競價排名

前言

Go大概2009年面世以來,已經(jīng)8年了,也算是8年抗戰(zhàn)。在這8年中,已經(jīng)有很多公司開始使用Go語言開發(fā)自己的服務(wù),甚至完全轉(zhuǎn)向Go開發(fā),也誕生了很多基于Go的服務(wù)和應(yīng)用,比如Dokcer、k8s等,很多的大公司也在用,比如google(作為開發(fā)Go語言的公司,當(dāng)仁不讓)、Facebook、騰訊、百度、阿里、京東、小米以及360,當(dāng)然除了以上提到的,還有很多公司也都開始嘗試Golang,這其中是什么原因呢?讓我們來一起分析分析。

原因 1:性能


Go 極其地快。其性能與 Java 或 C++相似。在我們的使用中,Go 一般比 Python 要快 30 倍。

以下是 Go 與 Java 之間的基準(zhǔn)比較:

原因 2:語言性能很重要

對很多應(yīng)用來說,編程語言只是簡單充當(dāng)了其與數(shù)據(jù)集之間的膠水。語言本身的性能常常無關(guān)輕重。

但是 Stream 是一個 API 提供商,服務(wù)于世界 500 強以及超過 2 億的終端用戶。數(shù)年來我們已經(jīng)優(yōu)化了 Cassandra、PostgreSQL、Redis 等等,然而最終抵達了所使用語言的極限。

原因 3:開發(fā)者效率不要過于創(chuàng)新

看一下絕佳的入門教程《開始學(xué)習(xí) Go 語言》(http://howistart.org/posts/go/1/)中的一小段代碼:

package main
type openWeatherMap struct{}

func (w openWeatherMap) temperature(city string) (float64, error) {
 resp, err := http.Get("http://api.openweathermap.org/data/2.5/weather?APPID=YOUR_API_KEYq=" + city)
 if err != nil {
 return 0, err
 }

 defer resp.Body.Close()

 var d struct {
 Main struct {
 Kelvin float64 `json:"temp"`
 } `json:"main"`
 }

 if err := json.NewDecoder(resp.Body).Decode(d); err != nil {
 return 0, err
 }

 log.Printf("openWeatherMap: %s: %.2f", city, d.Main.Kelvin)
 return d.Main.Kelvin, nil
}

如果你是一個新手,看到這段代碼你并不會感到吃驚。它展示了多種賦值、數(shù)據(jù)結(jié)構(gòu)、指針、格式化以及內(nèi)置的 HTTP 庫。

當(dāng)我第一次編程時,我很喜歡使用 Python 的高階功能。Python 允許你創(chuàng)造性地使用正在編寫的代碼,比如,你可以:

  • 在代碼初始化時,使用 MetaClasses 自行注冊類別
  • 置換真假
  • 添加函數(shù)到內(nèi)置函數(shù)列表中
  • 通過奇妙的方法重載運算符

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

Go 強迫你堅持打牢基礎(chǔ),這也就為讀取任意代碼帶來了便利,并能很快搞明白當(dāng)下發(fā)生的事情。

注意:當(dāng)然如何容易還是要取決于你的使用案例。如果你要創(chuàng)建一個基本的 CRUD API,我還是建議你使用 Django + DRF,或者 Rails。

原因 4:并發(fā)性通道

Go 作為一門語言致力于使事情簡單化。它并未引入很多新概念,而是聚焦于打造一門簡單的語言,它使用起來異??焖俨⑶液唵?。其唯一的創(chuàng)新之處是 goroutines 和通道。Goroutines 是 Go 面向線程的輕量級方法,而通道是 goroutines 之間通信的優(yōu)先方式。

創(chuàng)建 Goroutines 的成本很低,只需幾千個字節(jié)的額外內(nèi)存,正由于此,才使得同時運行數(shù)百個甚至數(shù)千個 goroutines 成為可能。你可以借助通道實現(xiàn) goroutines 之間的通信。Go 運行時間可以表示所有的復(fù)雜性。Goroutines 以及基于通道的并發(fā)性方法使其非常容易使用所有可用的 CPU 內(nèi)核,并處理并發(fā)的 IO——所有不帶有復(fù)雜的開發(fā)。相較于 Python/Java,在一個 goroutine 上運行一個函數(shù)需要最小的樣板代碼。你只需使用關(guān)鍵詞「go」添加函數(shù)調(diào)用:

Go 的并發(fā)性方法非常容易上手,相較于 Node 也很有趣;在 Node 中,開發(fā)者必須密切關(guān)注異步代碼的處理。

并發(fā)性的另一個優(yōu)質(zhì)特性是競賽檢測器,這使其很容易弄清楚異步代碼中是否存在競態(tài)條件。下面是一些上手 Go 和通道的很好的資源:

  • https://gobyexample.com/channels
  • https://tour.golang.org/concurrency/2
  • http://guzalexander.com/2013/12/06/golang-channels-tutorial.html
  • https://www.golang-book.com/books/intro/10
  • https://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html

原因 5:快速的編譯時間

當(dāng)前我們使用 Go 編寫的最大微服務(wù)的編譯時間只需 6 秒。相較于 Java 和 C++呆滯的編譯速度,Go 的快速編譯時間是一個主要的效率優(yōu)勢。我熱愛擊劍,但是當(dāng)我依然記得代碼應(yīng)該做什么之時,事情已經(jīng)完成就更好了。

Go 之前的代碼編譯

原因 6:打造團隊的能力

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

幸運的是 Go 非常簡單,且易于學(xué)習(xí)。它只提供了基本功能而沒有多余。Go 引入的新概念是「defer」聲明,以及內(nèi)置的帶有 goroutines 和通道的并發(fā)性管理。正是由于 Go 的簡單性,任何的 Python、Elixir、C++、Scala 或者 Java 開發(fā)者皆可在一月內(nèi)組建成一個高效的 Go 團隊。

原因 7:強大的生態(tài)系統(tǒng)

Go 有著強大的工具支持,面向 Redis、RabbitMQ、PostgreSQL、Template parsing、Task scheduling、Expression parsing 和 RocksDB 的穩(wěn)定的庫。

Go 的生態(tài)系統(tǒng)相比于 Rust、Elixir 這樣的語言有很大的優(yōu)勢。當(dāng)然,它又略遜于 Java、Python 或 Node 這樣的語言,但它很穩(wěn)定,而且你會發(fā)現(xiàn)在很多基礎(chǔ)需求上,已經(jīng)有高質(zhì)量的文件包可用了。

原因 8:GOFMT,強制代碼格式

Gofmt 是一種強大的命令行功能,內(nèi)建在 Go 的編譯器中來規(guī)定代碼的格式。從功能上看,它類似于 Python 的 autopep8。格式一致很重要,但實際的格式標(biāo)準(zhǔn)并不總是非常重要。Gofmt 用一種官方的形式規(guī)格代碼,避免了不必要的討論。

原因 9:gRPC 和 Protocol Buffers

Go 語言對 protocol buffers 和 gRPC 有一流的支持。這兩個工具能一起友好地工作以構(gòu)建需要通過 RPC 進行通信的微服務(wù)器(microservices)。我們只需要寫一個清單(manifest)就能定義 RPC 調(diào)用發(fā)生的情況和參數(shù),然后從該清單將自動生成服務(wù)器和客戶端代碼。這樣產(chǎn)生代碼不僅快速,同時網(wǎng)絡(luò)占用也非常少。

對每位程序員來說,不管哪種語言,“學(xué)的扎實,能學(xué)以致用”才是王道!本文就為對 Go 語言感興趣的朋友們提供一些口碑不錯的學(xué)習(xí)書籍建議。

 一、《Go語言學(xué)習(xí)筆記》

(未找到對應(yīng)版本的電子書,大家可以去作者github:https://github.com/qyuhen/book)

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

適合人群:本書不適合編程初學(xué)入門,可供有實際編程經(jīng)驗或正在使用Go 工作的人群參考。

二、《Go語言實戰(zhàn)》


(點擊這里下載電子書) 

推薦理由:William Kennedy是一位熟練的軟件開發(fā)者,也是博客GoingGo.Net的作者。本書向讀者提供一個專注、全面且符合語言習(xí)慣的視角。Go語言實戰(zhàn)同時關(guān)注語言的規(guī)范和實現(xiàn),涉及的內(nèi)容包括語法、類型系統(tǒng)、并發(fā)、管道、測試,以及其他一些主題。

適合人群:全覆蓋,側(cè)重初學(xué)者

三、《Go Web編程》

(點擊這里下載電子書) 

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

適合人群:全覆蓋

四、《Go語言編程》

 

(點擊這里下載電子書)

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

適合人群:全覆蓋,側(cè)重有經(jīng)驗的程序員

五、《Go并發(fā)編程實戰(zhàn)(第2版)》

 

(點擊這里下載電子書)

推薦理由:本書首先介紹了Go語言的優(yōu)秀特性、安裝設(shè)置方法、工程結(jié)構(gòu)、標(biāo)準(zhǔn)命令和工具、語法基礎(chǔ)、數(shù)據(jù)類型以及流程控制方法,接著闡述了與多進程編程和多線程編程有關(guān)的知識,然后重點介紹了goroutine、channel以及Go提供的傳統(tǒng)同步方法,最后通過一個完整實例——網(wǎng)絡(luò)爬蟲框架進一步闡述Go語言的哲學(xué)和理念,同時分享作者在多年編程生涯中的一些見解和感悟。

適合人群:適用于有一定計算機編程基礎(chǔ)的從業(yè)者以及對Go語言編程感興趣的愛好者,非常適合作為Go語言編程進階教程。

六、《Go 語言程序設(shè)計》

 

(點擊這里下載電子書)

推薦理由:國外最經(jīng)典的Go語言著作,Go語言編程的先驅(qū)者Mark Summerfield的實踐經(jīng)驗總結(jié)。這是一本Go語言實戰(zhàn)指南,幫你了解Go語言,按Go語言的方式思考,以及使用Go語言來編寫高性能軟件。

作者展示了如何編寫充分利用Go語言突破性的特性和慣用法的代碼,以及Go語言在其他語言之上所做的改進,并著重強調(diào)了Go語言的關(guān)鍵創(chuàng)新。

注重實踐教學(xué),每章都提供了多個經(jīng)過精心設(shè)計的代碼示例。

由國內(nèi)第一個核心服務(wù)完全采用Go語言實現(xiàn)的團隊——七牛團隊核心成員翻譯。

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

還想要更多學(xué)習(xí)的書籍???

看這里↓↓

總結(jié)

Go 是一種非常高效的語言,高度支持并發(fā)性。同時,它也像 C++和 Java 一樣快。雖然相比于 Python 和 Ruby,使用 Go 建立東西需要更多的時間,但在后續(xù)的代碼優(yōu)化上可以節(jié)省大量時間。這也是為什么向大家推薦這篇文章的原因。

您可能感興趣的文章:
  • Python和Go語言的區(qū)別總結(jié)

標(biāo)簽:衡水 仙桃 湘潭 黃山 崇左 蘭州 銅川 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《我放棄Python轉(zhuǎn)Go語言的9大理由(附優(yōu)秀書籍推薦)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    邵东县| 塘沽区| 阳高县| 辰溪县| 永善县| 新竹市| 任丘市| 海伦市| 通榆县| 阳东县| 怀集县| 漳浦县| 城步| 冷水江市| 元谋县| 南康市| 陈巴尔虎旗| 腾冲县| 香格里拉县| 贵德县| 吐鲁番市| 无锡市| 通山县| 当阳市| 克拉玛依市| 电白县| 烟台市| 丘北县| 仪征市| 南京市| 新化县| 丰都县| 项城市| 如东县| 湖州市| 读书| 秀山| 泰州市| 贺州市| 巨鹿县| 南岸区|