溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-09-08 01:32:50 來(lái)源:腳本之家 閱讀:279 作者:daisy 欄目:編程語(yǔ)言

前言

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

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

原因 1:性能

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

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

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

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

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

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

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

原因 2:語(yǔ)言性能很重要

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

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

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

看一下絕佳的入門教程《開始學(xué)習(xí) Go 語(yǔ)言》(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_KEY&q=" + 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
}

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

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

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

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

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

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

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

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

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

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

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

并發(fā)性的另一個(gè)優(yōu)質(zhì)特性是競(jìng)賽檢測(cè)器,這使其很容易弄清楚異步代碼中是否存在競(jìng)態(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:快速的編譯時(shí)間

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

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

Go 之前的代碼編譯

原因 6:打造團(tuán)隊(duì)的能力

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

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

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

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

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

原因 8:GOFMT,強(qiáng)制代碼格式

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

原因 9:gRPC 和 Protocol Buffers

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

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

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

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

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

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

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

二、《Go語(yǔ)言實(shí)戰(zhàn)》

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

(點(diǎn)擊這里下載電子書) 

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

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

三、《Go Web編程》

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

(點(diǎn)擊這里下載電子書) 

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

適合人群:全覆蓋

四、《Go語(yǔ)言編程》

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

(點(diǎn)擊這里下載電子書)

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

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

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

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

(點(diǎn)擊這里下載電子書)

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

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

六、《Go 語(yǔ)言程序設(shè)計(jì)》

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

(點(diǎn)擊這里下載電子書)

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

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

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

由國(guó)內(nèi)第一個(gè)核心服務(wù)完全采用Go語(yǔ)言實(shí)現(xiàn)的團(tuán)隊(duì)——七牛團(tuán)隊(duì)核心成員翻譯。

適合人群:適用于有一定Go語(yǔ)言編程編程的愛(ài)好者,非常適合作為Go語(yǔ)言編程進(jìn)階教程。

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

看這里↓↓

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

總結(jié)

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI