摘要:語言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級(jí)大牛和寫成。作者華為云技術(shù)宅基地鏈接谷歌前員工認(rèn)為,比起大家熟悉的,語言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替,他已經(jīng)在很多任務(wù)中使用語言替代了。
Go 語言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級(jí)大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 寫成。由于出身名門,Go 在誕生之初就吸引了大批開發(fā)者的關(guān)注。誕生十年以來,已經(jīng)涌出了很多基于 Go 的應(yīng)用。就在不多久之前,知乎也舍棄了 Python,轉(zhuǎn) 用Go 重構(gòu)推薦系統(tǒng) 。
作者:華為云技術(shù)宅基地
鏈接:https://zhuanlan.zhihu.com/p/...
谷歌前員工 Jake Wilson 認(rèn)為,比起大家熟悉的 Python,Go 語言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替 Python,他已經(jīng)在很多任務(wù)中使用 Go 語言替代了 Python。那么 Go 語言到底有著什么樣的獨(dú)特魅力?它有哪些勝于 Python 的地方呢?讓我們一起來了解一下吧!
2019 年程序員最想學(xué)習(xí)的編程語言出身名門的 Go 語言
對(duì)于一門只有十年歷史的新語言,Go 的發(fā)展勢(shì)頭相當(dāng)迅猛,容器界的扛把子 Docker 就是用 Go 寫的,國內(nèi)也有不少團(tuán)隊(duì)廣泛使用 Go。近日,HackerRank 在社區(qū)發(fā)起了程序員技能調(diào)查,來自 100 多個(gè)國家、超過 70000 名開發(fā)者參與其中。調(diào)查結(jié)果顯示,2019 年,程序員最想學(xué)習(xí)的編程語言 Top 3 分別是 Go、Kotlin 和 Python,其中 Go 以 37.2% 的比例排在首位。
但 Go 要想撼動(dòng)編程界的常青樹 Java 二十多年的地位無疑難度頗大。據(jù) HackerRank 數(shù)據(jù)顯示,2018 年,Java 在開發(fā)者最受歡迎的編程語言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,距離第一名 JavaScript 還有不小的差距。
但對(duì)本文作者 Jack Wilson 來說,Go 語言雖然“年紀(jì)尚小”,但已經(jīng)擁有很多非常優(yōu)秀的特性。
Go 語言到底好在哪?在很多任務(wù)上,我已經(jīng)用 Go 語言代替了 Python,舉幾個(gè)例子:
處理儲(chǔ)存在 S3 上的云端日志
在 S3 上的 bucket 和 / 或 region 之間移動(dòng) TB 級(jí)別大小的文件
匹配本地的數(shù)據(jù)庫記錄和 S3 上的文件,以保證文件處于同步狀態(tài)
這些任務(wù)大多是一次性的,所以使用腳本語言操作就會(huì)比較合適。這些任務(wù)需要快速地編程,而代碼用過一次一般就舍棄了。一般來說,這種任務(wù)的需求都比較新穎、比較專,其代碼很少需要復(fù)用。下面就來介紹一下,針對(duì)這種任務(wù)為什么可以用 Go 語言來替代 Python。
我經(jīng)常在寫 Python 時(shí)犯很低級(jí)的錯(cuò)誤。我會(huì)給變量或函數(shù)命錯(cuò)名,或向它們傳遞錯(cuò)誤的參數(shù)。這樣的錯(cuò)誤用調(diào)試工具可以找出一部分,但這種工具一般需要專門設(shè)置。我從來沒很方便地配置過 pylint,而且我也不喜歡用那些很重的、配置起來更麻煩的 IDE。最慘的情況是,你可能會(huì)不小心打錯(cuò)變量名,而這種錯(cuò)誤又不太容易發(fā)現(xiàn)。你的腳本可能會(huì)跑好幾個(gè)小時(shí)才遇上這個(gè)錯(cuò)誤,然后一切都崩潰了,你又得從頭開始跑這個(gè)腳本。這種錯(cuò)誤大部分都可以靠單元測(cè)試檢出,但單元測(cè)試很少能覆蓋 100% 的代碼,而且我并不想浪費(fèi)時(shí)間去給一個(gè)只用一次的腳本寫單元測(cè)試。而帶編譯器的語言就可以解決以上所有問題。編譯器可以檢測(cè)出你犯的所有低級(jí)錯(cuò)誤。出于這點(diǎn)原因,我在寫長(zhǎng)達(dá)幾百行的代碼時(shí),更傾向于使用 Go 這類語言。
然而,需要編譯的語言的一個(gè)缺點(diǎn)是,一般你的開發(fā)速度會(huì)下降。這點(diǎn)在 C/C++ 和 Java 等語言上體現(xiàn)得尤其明顯。而 Go 是一個(gè)非常簡(jiǎn)單的語言,我發(fā)現(xiàn)它的開發(fā)速度并沒有被拖慢多少。不要誤會(huì),我的意思并不是說它比 Python 還快,而是想說,用 Go 語言沒有比 Python 慢很多,一般達(dá)到使用 Python 開發(fā)速度的 85% 還是沒問題的。相對(duì)于擁有編譯器能避免的那些低級(jí)錯(cuò)誤來說,我認(rèn)為犧牲 15% 的開發(fā)速度還是很值的。
你可能已經(jīng)知道,Go 語言就是為并行而生的。在我的團(tuán)隊(duì)里經(jīng)常會(huì)需要并行程序,因?yàn)槲覀円?S3 上操作我們數(shù)據(jù)庫中大量的數(shù)據(jù)。如果該任務(wù)是 IO 密集型的(實(shí)際上很多任務(wù)都是),我們就可以很容易地部署 Python 線程。但如果任務(wù)是 CPU 密集型的,用 Python 就比較不方便了,因?yàn)橛腥纸忉屍麈i的存在。我非常享受在 Go 語言中簡(jiǎn)單代碼不用修改就能直接多線程運(yùn)行的爽快感。不知你在 Python 中有沒有遇到過這種問題:直接復(fù)制粘貼的多線程代碼卻完全不工作。在 Go 語言中就不會(huì)有此問題。
我比較喜歡把所有依賴放在單個(gè)二進(jìn)制文件里。我經(jīng)常在 EC2 服務(wù)器上運(yùn)行自己的腳本,好讓環(huán)境更加接近我們?cè)?S3 上的服務(wù)器。如果用 Python 的話,我需要保證所有需要的包都在服務(wù)器上裝好,而且我的同事不能在服務(wù)器上裝任何可能產(chǎn)生沖突的包。虛擬環(huán)境可以解決大部分問題,但我還是覺得用 Go 語言更方便。我一般是在 Mac 和 Linux 上交叉編譯我的代碼,將其拷貝到遠(yuǎn)程服務(wù)器上,然后就可以任其運(yùn)行了。我的代碼所需要的所有依賴都在一個(gè)二進(jìn)制文件里。
一開始,Go 語言的格式化工具 gofmt 實(shí)在是讓我抓狂,尤其是它在代碼縮進(jìn)時(shí)要求使用 tab 鍵而不是空格鍵。我覺得這簡(jiǎn)直是瘋了。但是我用了一段時(shí)間后,就開始“真香”了。寫代碼時(shí),我在格式上可以天馬行空,格式化工具會(huì)幫我完成一切。我的所有代碼風(fēng)格都是一致的,即使我是在寫不同的項(xiàng)目。這是因?yàn)?strong>格式化是標(biāo)準(zhǔn) Go 工具的一個(gè)特性。但我如果想在 Python 中實(shí)現(xiàn)這一點(diǎn),就要費(fèi)些勁兒了。我需要正確地配置 pylint 工具,并要保證在每一個(gè)項(xiàng)目中都使用它。
Gofmt 只是 Go 語言眾多工具中的一個(gè)小例子。所有我喜歡用的編輯器——VSCode,vim 和 Sublime Text 中,都有 Go 語言相應(yīng)的擴(kuò)展,讓我能夠方便地享受到 Go 工具的優(yōu)點(diǎn)。這樣,我就能獲得寫 Java 時(shí)的那種智能體驗(yàn),卻不需要真正使用一個(gè) IDE。我在用 Python 時(shí)從未獲得過這種體驗(yàn)。
Go 語言當(dāng)然也有缺點(diǎn)我每次看到批評(píng) Go 語言的文章時(shí),里面講的幾乎都是 Go 語言對(duì)關(guān)鍵特性的缺失,比如泛型。我倒是認(rèn)為沒有泛型沒什么影響——你會(huì)發(fā)現(xiàn),使用map和切片(Slice)就能實(shí)現(xiàn)多得驚人的操作。但是我在使用 Go 語言的過程中遇到了很多其他問題。
首先,Go 語言可能是我用過的語言里最“固執(zhí)”的語言了。比如,它除了會(huì)強(qiáng)迫你使用 tab 而不是空格鍵縮進(jìn)(假設(shè)你用了 gofmt 工具),會(huì)強(qiáng)迫你使用特定的文件組織結(jié)構(gòu),還會(huì)強(qiáng)迫你在 GOPATH 環(huán)境變量中編程,如此等等。這種語言有太多難以改變的特性了。Go 語言簡(jiǎn)單易學(xué)的原因之一恐怕就是你不能改變這些特性。如果你不愿意將所有首字母大寫的變量名 export 一遍,那真是抱歉了。幸運(yùn)的是,Go 的這些特性倒是沒有觸犯我的原則底線,但是如果有人認(rèn)為里面的某些要求根本無法理喻,我也能夠理解。相比之下 Python 就靈活多了。
在這方面把 Go 語言和 Python 做比較有些不公平。Go 的出現(xiàn)比 Python 晚很多,但當(dāng)我發(fā)現(xiàn)有些功能 Go 居然不支持的時(shí)候,還是覺得很困惑。我甚至發(fā)現(xiàn) StackOverflow 上很多人 po 出了本應(yīng)該作為內(nèi)置功能的代碼段,而且大家都需要該功能,紛紛將代碼復(fù)制粘貼到自己的項(xiàng)目下。這類功能不應(yīng)該嵌入到語言內(nèi)部嗎?說到這里,我想到了近幾年的兩個(gè)例子:
給切片排序(幸運(yùn)的是在 Go 1.8 版本中這點(diǎn)方便多了)
Math.round 只支持整數(shù),不能進(jìn)行浮點(diǎn)數(shù)的取整(比如你想找一個(gè)最接近 0.5 的整數(shù),Go 語言就無法完成)。甚至在 Go 1.10 版本之前,根本沒有 math.round 函數(shù)
當(dāng)然,這些問題的原因有一部分是 Go 語言沒有泛型,另一部分是因?yàn)?Go 的開發(fā)者們只給 Go 的標(biāo)準(zhǔn)庫中添加最最必要的功能。
這兩點(diǎn)我都理解,但是在遇到很小的問題卻需要自己寫代碼解決時(shí)還是感到煩惱。希望隨著 Go 語言的發(fā)展,它的問題會(huì)變得越來越少。
Go 和 Python 你更喜歡誰?歡迎留言交流!
C/C++的問題:
開發(fā)效率低,對(duì)開發(fā)者要求高
libc只向后兼容,運(yùn)維難度偏大
Lua/Python的問題:
動(dòng)態(tài)語言,缺少編譯過程,低級(jí)錯(cuò)誤頻出
缺少有效的性能分析及調(diào)試工具
場(chǎng)景
當(dāng)時(shí)剛完成了nginx WAF模塊的開發(fā)工作,便開始著手搭建WAF的后臺(tái)管理系統(tǒng)。 由于之前同事都用的fluentd作為日志收集組件,為保持基礎(chǔ)組件的一致性,我也選擇了fluentd。 即最終架構(gòu)為fluentd->mongodb->mysql,再基于mysql做前端數(shù)據(jù)展示。 后來被坑了許多次,就決定用Go重寫fluentd以解決下面幾個(gè)問題:
fluentd在ubuntu 9.04偶爾會(huì)出現(xiàn)假死,導(dǎo)致數(shù)據(jù)丟失
fluentd難以接入公司現(xiàn)有的包發(fā)布系統(tǒng),導(dǎo)致運(yùn)維難度極大
mongodb采用mmap實(shí)現(xiàn),數(shù)據(jù)量大時(shí)占用內(nèi)存過高
方案
gofluent的代碼 請(qǐng)點(diǎn)擊這里
httpmq的代碼 請(qǐng)點(diǎn)擊這里
事實(shí)上,這兩個(gè)項(xiàng)目都是為了解決上面提到的問題。 說起來也許你不信,這兩個(gè)套代碼是我在業(yè)余時(shí)間完成的,也就是說這根本不算在KPI之內(nèi)。 其實(shí)一開始我也沒想到能夠這么快就寫得七七八八,畢竟是現(xiàn)學(xué)現(xiàn)用啊。 但實(shí)際情況就是,我花了一周時(shí)間寫完httpmq,一個(gè)月多時(shí)間就寫好了gofluent……當(dāng)然,這兩個(gè)項(xiàng)目還有很多不完善的地方。目前就日志收集方案來說,我更推薦elastic/logstash-forwarder · GitHub和elastic/logstash · GitHub配合使用。
為什么選擇Golang
那么,為什么我會(huì)選擇Golang呢?其實(shí)我在做出這個(gè)選擇之前已經(jīng)花了大量時(shí)間做過詳盡調(diào)研。 國外如Google、AWS、Cloudflare、CoreOS等,國內(nèi)如七牛、阿里等都已經(jīng)開始大規(guī)模使用Golang開發(fā)其云計(jì)算相關(guān)產(chǎn)品。 跟著世界級(jí)巨人的腳步應(yīng)該不至于走錯(cuò)方向,而且在學(xué)習(xí)Golang的過程中,我也漸漸被其背后的設(shè)計(jì)哲學(xué)所折服。
另外,云風(fēng)博客中曾說過這樣一句話:
我發(fā)現(xiàn)我花了四年時(shí)間錘煉自己用 C 語言構(gòu)建系統(tǒng)的能力,試圖找到一個(gè)規(guī)范,可以更好的編寫軟件。結(jié)果發(fā)現(xiàn)只是對(duì) Go 的模仿。缺乏語言層面的支持,只能是一個(gè)拙劣的模仿。
以下則是我對(duì)Golang的淺薄理解:
有C基礎(chǔ),學(xué)Golang非常輕松
同步方式輕松實(shí)現(xiàn)高并發(fā)
代碼簡(jiǎn)潔,格式統(tǒng)一,閱讀方便
性能強(qiáng)勁的同時(shí),開發(fā)效率又不差于Python等動(dòng)態(tài)語言
效果
最開始準(zhǔn)備上線的時(shí)候其實(shí)心里挺忐忑,畢竟一旦出現(xiàn)故障,不僅黑鍋得自己背,面子也上過不去啊。 還好結(jié)果蠻漂亮,自上線后沒出現(xiàn)過一次突發(fā)性BUG,降低運(yùn)維難度的同時(shí)還減少了機(jī)器的負(fù)載。
總而言之,從工程的角度上來看,對(duì)于大多數(shù)后臺(tái)應(yīng)用場(chǎng)景,選擇Golang是極為明智的選擇。 這樣可以很輕松的兼顧運(yùn)行性能、開發(fā)效率及維護(hù)難度這三大讓諸多程序猿欲仙欲死的奇點(diǎn)。
閱讀更多資本寒冬下的android面經(jīng)
編程時(shí),照著別人的代碼敲進(jìn)去有效率嗎?
開發(fā)了5年android,我開始了go學(xué)習(xí)之旅
2018 開發(fā)者生態(tài)報(bào)告:Java 最流行,Go 最有潛力,JavaScript最常用
最后, 我還是建議你在這個(gè)互聯(lián)網(wǎng)時(shí)代里,不要刻意追求一種語言,每一種語言都是有他的優(yōu)勢(shì),選擇合適的才是最重要的?;ヂ?lián)網(wǎng)沒有過期的技術(shù),也沒有寒冷的冬天。我們選擇盡可能多的儲(chǔ)備糧食柴火。歡迎關(guān)注我微信技術(shù)號(hào):終端研發(fā)部,id:codeGoogler。如果您遇到什么問題,也可以和我一塊交流~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43341.html
摘要:我們都知道,最近,發(fā)布了月份編程語言排行榜。其中,前三名依然健穩(wěn)不變,他們分別是,第四則為,第五則為。這樣比較一下,發(fā)現(xiàn)確實(shí)會(huì)長(zhǎng)期是編程語言的第一名。很多人看好的語言,卻仍在左右徘徊。 我們都知道,最近,TIOBE 發(fā)布了 5 月份編程語言排行榜。其中,前三名依然健穩(wěn)不變,他們分別是 Java、C、C++,第四則為: Python ,第五則為 VB .NET。 下面兩張圖,我們可以看到...
摘要:很巧的是,我的第一個(gè)網(wǎng)站部落,就是在年月份注冊(cè)的域名,月開始正式上線,也就是從那段時(shí)間開始我實(shí)現(xiàn)了轉(zhuǎn)變。然而今天,我終于要和那一段曾經(jīng)的歲月說一聲再見了,要和那段青春又美好的回憶說再見了,要和陪伴著自己近三千多個(gè)日日夜夜的她說再見了。6月注定是一個(gè)不平常的時(shí)間。寫這篇文章時(shí)正好是全國高考結(jié)束后的第一天(2017年6月9日),對(duì)于參考完高考的人來說他們即將面臨著人生的一次重要轉(zhuǎn)變。很巧的是,我...
摘要:今天我們來說一個(gè)非常實(shí)用的例子,小菜接到組長(zhǎng)老王的一個(gè)任務(wù),安排一個(gè)新的活,這個(gè)活是這樣的老王小菜啊,你幫我寫一個(gè)登入腳本,跑十幾條命令到服務(wù)器上,然后存一下日志。這個(gè)時(shí)候,小菜偷偷的瞄了一眼組長(zhǎng)老王,常舒一口氣,總于寫完了。 Python學(xué)了好幾年,發(fā)現(xiàn)功力還是那樣,很多同學(xué)經(jīng)常這樣抱...
閱讀 2289·2019-08-30 15:56
閱讀 3121·2019-08-30 13:48
閱讀 1137·2019-08-30 10:52
閱讀 1508·2019-08-29 17:30
閱讀 433·2019-08-29 13:44
閱讀 3572·2019-08-29 12:53
閱讀 1129·2019-08-29 11:05
閱讀 2680·2019-08-26 13:24