RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Go語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替Python

DPVg_AI_era ? 來(lái)源:lq ? 2019-02-13 10:01 ? 次閱讀

出身名門(mén)的Go語(yǔ)言在誕生之初就吸引了大批開(kāi)發(fā)者的關(guān)注。比起大家熟悉的Python,Go語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替Python。Go和Python你更喜歡誰(shuí)?

Go 語(yǔ)言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級(jí)大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 寫(xiě)成。由于出身名門(mén),Go 在誕生之初就吸引了大批開(kāi)發(fā)者的關(guān)注。誕生十年以來(lái),已經(jīng)涌出了很多基于 Go 的應(yīng)用。就在不多久之前,知乎也舍棄了 Python,轉(zhuǎn)用Go 重構(gòu)推薦系統(tǒng)。谷歌前員工 Jake Wilson 認(rèn)為,比起大家熟悉的 Python,Go 語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替 Python,他已經(jīng)在很多任務(wù)中使用 Go 語(yǔ)言替代了 Python。那么 Go 語(yǔ)言到底有著什么樣的獨(dú)特魅力?它有哪些勝于 Python 的地方呢?讓我們一起來(lái)了解一下吧!

2019 年程序員最想學(xué)習(xí)的編程語(yǔ)言

出身名門(mén)的 Go 語(yǔ)言

對(duì)于一門(mén)只有十年歷史的新語(yǔ)言,Go 的發(fā)展勢(shì)頭相當(dāng)迅猛,容器界的扛把子 Docker 就是用 Go 寫(xiě)的,國(guó)內(nèi)也有不少團(tuán)隊(duì)廣泛使用 Go。近日,HackerRank 在社區(qū)發(fā)起了程序員技能調(diào)查,來(lái)自 100 多個(gè)國(guó)家、超過(guò) 70000 名開(kāi)發(fā)者參與其中。調(diào)查結(jié)果顯示,2019 年,程序員最想學(xué)習(xí)的編程語(yǔ)言 Top 3 分別是 Go、Kotlin 和 Python,其中 Go 以 37.2% 的比例排在首位。

但 Go 要想撼動(dòng)編程界的常青樹(shù) Java 二十多年的地位無(wú)疑難度頗大。據(jù) HackerRank 數(shù)據(jù)顯示,2018 年,Java 在開(kāi)發(fā)者最受歡迎的編程語(yǔ)言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,距離第一名 JavaScript 還有不小的差距。

但對(duì)本文作者 Jack Wilson 來(lái)說(shuō),Go 語(yǔ)言雖然“年紀(jì)尚小”,但已經(jīng)擁有很多非常優(yōu)秀的特性。

Go 語(yǔ)言到底好在哪?

在很多任務(wù)上,我已經(jīng)用 Go 語(yǔ)言代替了 Python,舉幾個(gè)例子:

處理儲(chǔ)存在 S3 上的云端日志

在 S3 上的 bucket 和 / 或 region 之間移動(dòng) TB 級(jí)別大小的文件

匹配本地的數(shù)據(jù)庫(kù)記錄和 S3 上的文件,以保證文件處于同步狀態(tài)

這些任務(wù)大多是一次性的,所以使用腳本語(yǔ)言操作就會(huì)比較合適。這些任務(wù)需要快速地編程,而代碼用過(guò)一次一般就舍棄了。一般來(lái)說(shuō),這種任務(wù)的需求都比較新穎、比較專,其代碼很少需要復(fù)用。下面就來(lái)介紹一下,針對(duì)這種任務(wù)為什么可以用 Go 語(yǔ)言來(lái)替代 Python。

擁有編譯器很方便

我經(jīng)常在寫(xiě) Python 時(shí)犯很低級(jí)的錯(cuò)誤。我會(huì)給變量或函數(shù)命錯(cuò)名,或向它們傳遞錯(cuò)誤的參數(shù)。這樣的錯(cuò)誤用調(diào)試工具可以找出一部分,但這種工具一般需要專門(mén)設(shè)置。我從來(lái)沒(méi)很方便地配置過(guò) pylint,而且我也不喜歡用那些很重的、配置起來(lái)更麻煩的 IDE。最慘的情況是,你可能會(huì)不小心打錯(cuò)變量名,而這種錯(cuò)誤又不太容易發(fā)現(xiàn)。你的腳本可能會(huì)跑好幾個(gè)小時(shí)才遇上這個(gè)錯(cuò)誤,然后一切都崩潰了,你又得從頭開(kāi)始跑這個(gè)腳本。這種錯(cuò)誤大部分都可以靠單元測(cè)試檢出,但單元測(cè)試很少能覆蓋 100% 的代碼,而且我并不想浪費(fèi)時(shí)間去給一個(gè)只用一次的腳本寫(xiě)單元測(cè)試。而帶編譯器的語(yǔ)言就可以解決以上所有問(wèn)題。編譯器可以檢測(cè)出你犯的所有低級(jí)錯(cuò)誤。出于這點(diǎn)原因,我在寫(xiě)長(zhǎng)達(dá)幾百行的代碼時(shí),更傾向于使用 Go 這類語(yǔ)言。

開(kāi)發(fā)速度

然而,需要編譯的語(yǔ)言的一個(gè)缺點(diǎn)是,一般你的開(kāi)發(fā)速度會(huì)下降。這點(diǎn)在 C/C++ 和 Java 等語(yǔ)言上體現(xiàn)得尤其明顯。而 Go 是一個(gè)非常簡(jiǎn)單的語(yǔ)言,我發(fā)現(xiàn)它的開(kāi)發(fā)速度并沒(méi)有被拖慢多少。不要誤會(huì),我的意思并不是說(shuō)它比 Python 還快,而是想說(shuō),用 Go 語(yǔ)言沒(méi)有比 Python 慢很多,一般達(dá)到使用 Python 開(kāi)發(fā)速度的 85% 還是沒(méi)問(wèn)題的。相對(duì)于擁有編譯器能避免的那些低級(jí)錯(cuò)誤來(lái)說(shuō),我認(rèn)為犧牲 15% 的開(kāi)發(fā)速度還是很值的。

更好的并行性

你可能已經(jīng)知道,Go 語(yǔ)言就是為并行而生的。在我的團(tuán)隊(duì)里經(jīng)常會(huì)需要并行程序,因?yàn)槲覀円?S3 上操作我們數(shù)據(jù)庫(kù)中大量的數(shù)據(jù)。如果該任務(wù)是 IO 密集型的(實(shí)際上很多任務(wù)都是),我們就可以很容易地部署 Python 線程。但如果任務(wù)是 CPU 密集型的,用 Python 就比較不方便了,因?yàn)橛腥纸忉屍麈i的存在。我非常享受在 Go 語(yǔ)言中簡(jiǎn)單代碼不用修改就能直接多線程運(yùn)行的爽快感。不知你在 Python 中有沒(méi)有遇到過(guò)這種問(wèn)題:直接復(fù)制粘貼的多線程代碼卻完全不工作。在 Go 語(yǔ)言中就不會(huì)有此問(wèn)題。

部署簡(jiǎn)單

我比較喜歡把所有依賴放在單個(gè)二進(jìn)制文件里。我經(jīng)常在 EC2 服務(wù)器上運(yùn)行自己的腳本,好讓環(huán)境更加接近我們?cè)?S3 上的服務(wù)器。如果用 Python 的話,我需要保證所有需要的包都在服務(wù)器上裝好,而且我的同事不能在服務(wù)器上裝任何可能產(chǎn)生沖突的包。虛擬環(huán)境可以解決大部分問(wèn)題,但我還是覺(jué)得用 Go 語(yǔ)言更方便。我一般是在 Mac 和 Linux 上交叉編譯我的代碼,將其拷貝到遠(yuǎn)程服務(wù)器上,然后就可以任其運(yùn)行了。我的代碼所需要的所有依賴都在一個(gè)二進(jìn)制文件里。

風(fēng)格一致

一開(kāi)始,Go 語(yǔ)言的格式化工具 gofmt 實(shí)在是讓我抓狂,尤其是它在代碼縮進(jìn)時(shí)要求使用 tab 鍵而不是空格鍵。我覺(jué)得這簡(jiǎn)直是瘋了。但是我用了一段時(shí)間后,就開(kāi)始“真香”了。寫(xiě)代碼時(shí),我在格式上可以天馬行空,格式化工具會(huì)幫我完成一切。我的所有代碼風(fēng)格都是一致的,即使我是在寫(xiě)不同的項(xiàng)目。這是因?yàn)楦袷交菢?biāo)準(zhǔn) Go 工具的一個(gè)特性。但我如果想在 Python 中實(shí)現(xiàn)這一點(diǎn),就要費(fèi)些勁兒了。我需要正確地配置 pylint 工具,并要保證在每一個(gè)項(xiàng)目中都使用它。

更便捷的工具

Gofmt 只是 Go 語(yǔ)言眾多工具中的一個(gè)小例子。所有我喜歡用的編輯器——VSCode,vim 和 Sublime Text 中,都有 Go 語(yǔ)言相應(yīng)的擴(kuò)展,讓我能夠方便地享受到 Go 工具的優(yōu)點(diǎn)。這樣,我就能獲得寫(xiě) Java 時(shí)的那種智能體驗(yàn),卻不需要真正使用一個(gè) IDE。我在用 Python 時(shí)從未獲得過(guò)這種體驗(yàn)。

Go 語(yǔ)言當(dāng)然也有缺點(diǎn)

我每次看到批評(píng) Go 語(yǔ)言的文章時(shí),里面講的幾乎都是 Go 語(yǔ)言對(duì)關(guān)鍵特性的缺失,比如泛型。我倒是認(rèn)為沒(méi)有泛型沒(méi)什么影響——你會(huì)發(fā)現(xiàn),使用map和切片(Slice)就能實(shí)現(xiàn)多得驚人的操作。但是我在使用 Go 語(yǔ)言的過(guò)程中遇到了很多其他問(wèn)題。

缺乏靈活性

首先,Go 語(yǔ)言可能是我用過(guò)的語(yǔ)言里最“固執(zhí)”的語(yǔ)言了。比如,它除了會(huì)強(qiáng)迫你使用 tab 而不是空格鍵縮進(jìn)(假設(shè)你用了 gofmt 工具),會(huì)強(qiáng)迫你使用特定的文件組織結(jié)構(gòu),還會(huì)強(qiáng)迫你在 GOPATH 環(huán)境變量中編程,如此等等。這種語(yǔ)言有太多難以改變的特性了。Go 語(yǔ)言簡(jiǎn)單易學(xué)的原因之一恐怕就是你不能改變這些特性。如果你不愿意將所有首字母大寫(xiě)的變量名 export 一遍,那真是抱歉了。幸運(yùn)的是,Go 的這些特性倒是沒(méi)有觸犯我的原則底線,但是如果有人認(rèn)為里面的某些要求根本無(wú)法理喻,我也能夠理解。相比之下 Python 就靈活多了。

庫(kù)支持有點(diǎn)差勁

在這方面把 Go 語(yǔ)言和 Python 做比較有些不公平。Go 的出現(xiàn)比 Python 晚很多,但當(dāng)我發(fā)現(xiàn)有些功能 Go 居然不支持的時(shí)候,還是覺(jué)得很困惑。我甚至發(fā)現(xiàn) StackOverflow 上很多人 po 出了本應(yīng)該作為內(nèi)置功能的代碼段,而且大家都需要該功能,紛紛將代碼復(fù)制粘貼到自己的項(xiàng)目下。這類功能不應(yīng)該嵌入到語(yǔ)言內(nèi)部嗎?說(shuō)到這里,我想到了近幾年的兩個(gè)例子:

給切片排序(幸運(yùn)的是在 Go 1.8 版本中這點(diǎn)方便多了)

Math.round 只支持整數(shù),不能進(jìn)行浮點(diǎn)數(shù)的取整(比如你想找一個(gè)最接近 0.5 的整數(shù),Go 語(yǔ)言就無(wú)法完成)。甚至在 Go 1.10 版本之前,根本沒(méi)有 math.round 函數(shù)

當(dāng)然,這些問(wèn)題的原因有一部分是 Go 語(yǔ)言沒(méi)有泛型,另一部分是因?yàn)?Go 的開(kāi)發(fā)者們只給 Go 的標(biāo)準(zhǔn)庫(kù)中添加最最必要的功能。

這兩點(diǎn)我都理解,但是在遇到很小的問(wèn)題卻需要自己寫(xiě)代碼解決時(shí)還是感到煩惱。

希望隨著 Go 語(yǔ)言的發(fā)展,它的問(wèn)題會(huì)變得越來(lái)越少。

Go 和 Python 你更喜歡誰(shuí)?歡迎留言交流!

作者介紹:

Jake Wilson,現(xiàn)任 SketchUp web team 技術(shù)經(jīng)理,研究范圍包括 HTML5、WebGL、Google Closure、Typescript、Java Redis 后端開(kāi)發(fā)等,從事軟件開(kāi)發(fā)、硬件產(chǎn)品、創(chuàng)業(yè)和激勵(lì)方面的工作。他曾就職于 Boxuno.com、Monolla.com、谷歌等公司。在谷歌,他曾參與 Goole+、chrome、Webmaster Tools 等項(xiàng)目。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1942

    瀏覽量

    34707
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4792

    瀏覽量

    84627
  • go語(yǔ)言
    +關(guān)注

    關(guān)注

    1

    文章

    158

    瀏覽量

    9047

原文標(biāo)題:再見(jiàn),Python!你好,Go語(yǔ)言

文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    在學(xué)習(xí)go語(yǔ)言的過(guò)程踩過(guò)的坑

    作為一個(gè)5年的phper,這兩年公司和個(gè)人都在順應(yīng)技術(shù)趨勢(shì),新項(xiàng)目慢慢從php轉(zhuǎn)向了go語(yǔ)言,從2021年到現(xiàn)在,筆者手上也先后開(kāi)發(fā)了兩個(gè)go項(xiàng)目。在學(xué)習(xí)go
    的頭像 發(fā)表于 11-11 09:22 ?158次閱讀

    go語(yǔ)言如何解決并發(fā)問(wèn)題

    作為一個(gè)后端開(kāi)發(fā),日常工作中接觸最多的兩門(mén)語(yǔ)言就是PHP和GO了。無(wú)可否認(rèn),PHP確實(shí)是最好的語(yǔ)言(手動(dòng)狗頭哈哈),寫(xiě)起來(lái)真的很舒爽,沒(méi)有任何心智負(fù)擔(dān),字符串和整型壓根就不用區(qū)分,開(kāi)發(fā)速度真的是比
    的頭像 發(fā)表于 10-23 13:38 ?133次閱讀
    <b class='flag-5'>go</b><b class='flag-5'>語(yǔ)言</b>如何解決并發(fā)問(wèn)題

    谷景科普一體成型電感可以代替磁環(huán)電感嗎

    谷景科普一體成型電感可以代替磁環(huán)電感嗎編輯:谷景電子一體成型電感和磁環(huán)電感雖然都是電感產(chǎn)品,但它們都有著自己的特性和應(yīng)用場(chǎng)景。很多人好奇嗎,一體成型電感是否
    發(fā)表于 08-18 20:26 ?0次下載

    ADS7823的參考電壓和iic通訊端口是否都可以連接5V電壓?

    根據(jù)ADS7823的規(guī)格書(shū)vdd最大輸入電壓為5V,想請(qǐng)教一下再VDD輸入5V電源,芯片的參考電壓和iic通訊端口是否都可以連接5V電壓?
    發(fā)表于 08-13 07:28

    Python語(yǔ)言基礎(chǔ)2

    電子發(fā)燒友網(wǎng)站提供《Python語(yǔ)言基礎(chǔ)2.rar》資料免費(fèi)下載
    發(fā)表于 07-17 17:23 ?1次下載

    opencv-python和opencv一樣嗎

    是OpenCV的一個(gè)Python語(yǔ)言接口,它允許開(kāi)發(fā)者使用Python語(yǔ)言來(lái)調(diào)用OpenCV庫(kù)的功能。 雖然OpenCV和OpenCV-Python
    的頭像 發(fā)表于 07-16 10:38 ?1160次閱讀

    人員定位系統(tǒng)都可以用于哪些行業(yè)?

    。 一、人員定位系統(tǒng)都可以用于哪些行業(yè)? 這套系統(tǒng)可以服務(wù)的行業(yè)非常多,尤其是崗位具有一定危險(xiǎn)性的,那么定位系統(tǒng)可以說(shuō)發(fā)揮的作用十分明顯,比如化工廠、消防員、礦井、戶外勘探等,而為了便于人員管理的場(chǎng)景也
    的頭像 發(fā)表于 07-15 11:32 ?354次閱讀
    人員定位系統(tǒng)<b class='flag-5'>都可以</b>用于哪些行業(yè)?

    ESP32模組的EXT0和EXT1喚醒源都可以選擇哪些引腳?

    模組的 EXT0 和 EXT1 喚醒源都可以選擇哪些引腳?在技術(shù)文檔的哪些部分有相關(guān)說(shuō)明?
    發(fā)表于 06-13 06:04

    使用Docker部署Go Web應(yīng)用程序步驟

    大多數(shù)情況下Go應(yīng)用程序被編譯成單個(gè)二進(jìn)制文件,web應(yīng)用程序則會(huì)包括模版和配置文件。而當(dāng)一個(gè)項(xiàng)目中有很多文件的時(shí)候,由于很多文件沒(méi)有同步就會(huì)導(dǎo)致錯(cuò)誤的發(fā)生并且產(chǎn)生
    發(fā)表于 04-20 09:33 ?493次閱讀
    使用Docker部署<b class='flag-5'>Go</b> Web應(yīng)用程序步驟

    很多薄膜電容壽命很短,這是怎么回事呢?

    很多客戶在選擇薄膜電容的時(shí)候,也會(huì)重視產(chǎn)品質(zhì)量,一般都會(huì)先對(duì)電容樣品進(jìn)行測(cè)試,性能沒(méi)有問(wèn)題以后才會(huì)大量選用。
    的頭像 發(fā)表于 03-29 14:17 ?518次閱讀

    繼電器可以用什么替代?3a 220vac 3a 28vdc都是什么意思?

    用電子開(kāi)關(guān)也可以代替繼電器的開(kāi)關(guān)。如可控硅、開(kāi)關(guān)二極管、開(kāi)關(guān)三極管、電子雙向開(kāi)關(guān)IC、光電耦合器、集成開(kāi)關(guān)電路……等等很多都可以代替繼電器的
    發(fā)表于 02-18 09:58 ?4356次閱讀

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言: C語(yǔ)言是一種面向過(guò)程的編程
    的頭像 發(fā)表于 02-05 14:11 ?2360次閱讀

    PSoC雙核架構(gòu)中雙核都可以訪問(wèn)全部外設(shè)嗎?

    你好!如標(biāo)題:PSoC 雙核架構(gòu)中兩個(gè)內(nèi)核對(duì)芯片的全部外設(shè)都有直接訪問(wèn)能力嘛?如果都可以直接訪問(wèn),那IPC模塊的主要應(yīng)用場(chǎng)景是哪些呢?
    發(fā)表于 02-02 11:44

    自發(fā)電設(shè)備:可穿戴設(shè)備的能量收集技術(shù)取得重大進(jìn)展

    當(dāng)今最知名的可穿戴設(shè)備能量收集技術(shù)當(dāng)然是太陽(yáng)能,它可以從陽(yáng)光或環(huán)境光照中提取電子。但太陽(yáng)能只是序幕。研究人員發(fā)現(xiàn),我們其實(shí)有很多以微瓦功率獲取能量的選擇,可以取代可穿戴設(shè)備中的電池。
    的頭像 發(fā)表于 01-29 15:49 ?853次閱讀
    自發(fā)電設(shè)備:可穿戴設(shè)備的能量收集技術(shù)取得重大進(jìn)展

    電感量一樣都可以代換嗎

    電感作為電路中的重要電子元器件,它在電路中的作用主要是儲(chǔ)存能量和濾波。在電感使用中,我們經(jīng)常會(huì)遇到有客戶咨詢關(guān)于電感替換的問(wèn)題。有人問(wèn)是不是電感量一樣都可以替換?本篇我們就來(lái)簡(jiǎn)單探討以下這個(gè)問(wèn)題吧
    的頭像 發(fā)表于 01-17 09:49 ?503次閱讀
    RM新时代网站-首页