谷歌軟件工程師:我為什么喜歡用Go語(yǔ)言?
Go語(yǔ)言最近幾年逐漸獲得越來(lái)越多的開發(fā)者的喜歡。在Go社區(qū)前不久剛剛慶祝Go誕生10周年生日之際,谷歌云軟件工程師Benjamin Congdon發(fā)表個(gè)人博客,表達(dá)了自己對(duì)Go倍加青睞的一些原因。他表示,“簡(jiǎn)潔”是他喜歡使用Go語(yǔ)言最重要的原因。
以下是博客內(nèi)容:
我使用Go已經(jīng)好幾年了,我最欣賞Go的一點(diǎn)就是它的簡(jiǎn)潔性。我在幾個(gè)月前開始在工作中使用Go寫代碼,發(fā)現(xiàn)它真的很容易實(shí)現(xiàn)迭代,比Python和Java更為復(fù)雜的迭代。
當(dāng)Go社區(qū)慶祝10歲生日時(shí),我一直在想,是什么使Go變得如此與眾不同。我認(rèn)為Go的許多真正力量來(lái)自其設(shè)計(jì)師的理念:高度強(qiáng)調(diào)前向兼容性,該語(yǔ)言沒(méi)有損害可讀性的特性,并且隨手可得。它提供了用戶真正需要的一切(基本測(cè)試庫(kù),可靠的聯(lián)網(wǎng)、同步原語(yǔ)以及模板等)。
前向兼容性有多高、版本依賴性就有多低
我認(rèn)為,和其它語(yǔ)言相比,Go具有最完善的版本控制和依賴關(guān)系。我沒(méi)有因?yàn)镚o的版本更新遇到任何損失。這一點(diǎn)很重要。在差不多的時(shí)間段內(nèi),由于Rust的API更改,臭名昭著的Python 2到3過(guò)渡,我的項(xiàng)目一度陷入了中斷。坦率地說(shuō),我覺(jué)得npm升級(jí)后的任何舊JS項(xiàng)目能不能延續(xù)都不好說(shuō)。
借助Go,我注意到Go的庫(kù)趨于穩(wěn)定。在Python和JavaScript中,如果有3年未更新的庫(kù),則表明該庫(kù)已死。而在Go生態(tài)系統(tǒng)中,這個(gè)庫(kù)可能仍然可以使用。在其他社區(qū)中被視為停滯或忽視的事物,在Go這里反而是復(fù)興的標(biāo)志。
在Go中,我需要的依賴項(xiàng)更少,而依賴項(xiàng)本身的依賴項(xiàng)也更少。Go沒(méi)有將更多的邏輯導(dǎo)出到外部依賴項(xiàng)習(xí)慣。Go社區(qū)中也更容易接受代碼重復(fù)。有時(shí)這一點(diǎn)可能令人沮喪。有時(shí)你可能只想要一個(gè)執(zhí)行某種類型的環(huán)境或分析的庫(kù)。很多時(shí)候,你需要自己動(dòng)手編寫,或者從StackOverflow答案中去尋找。不過(guò)總的來(lái)說(shuō),我認(rèn)為這一點(diǎn)還是利大于弊。更少的依賴項(xiàng)意味著項(xiàng)目閑置幾個(gè)月之后被迫中斷的可能性更低。
不過(guò),現(xiàn)在下結(jié)論可能對(duì)其他編程語(yǔ)言有點(diǎn)不公平。Rust尚未達(dá)到Go所具有的穩(wěn)定性,這可能是因?yàn)镽ust還不是一種成熟的語(yǔ)言,但也正朝著逐步成熟方向發(fā)展。Python 3本身是向前兼容的,我希望Python核心開發(fā)人員能從中學(xué)到一些教訓(xùn)。在這方面,我對(duì)Javascript已經(jīng)不抱什么希望了。
Go的依附系統(tǒng)也不是沒(méi)有問(wèn)題。盡管GoModules很棒,但社區(qū)仍未達(dá)到100%的采用率。在使用GoModules之前,將所有內(nèi)容保存在$ GOPATH下的要求是如此煩人,以至于我推遲了多年才開始使用Go。現(xiàn)在情況已經(jīng)好轉(zhuǎn),開始顯示出逐步改善的跡象。
就向前兼容性而言,Go保證自Go 1發(fā)布以來(lái)編寫的所有Go代碼都可以工作到Go 2,直到將來(lái)某個(gè)不確定的時(shí)刻。這是一個(gè)強(qiáng)力的承諾,至少到目前為止,我對(duì)這種語(yǔ)言的使用體驗(yàn)還是非常積極的。
一些功能雖然現(xiàn)在不需要,以后可能很想要
在使用Go一段時(shí)間后,我開始想要一些Go語(yǔ)言根本不支持的額外功能。嗯,我對(duì)C ++模板的排斥程度不亞于任何一個(gè)人,但是擁有基本的集合類泛型這個(gè)要求也不過(guò)分,對(duì)吧?
具備“開箱即用”的僅有的兩個(gè)通用化數(shù)據(jù)結(jié)構(gòu)是數(shù)組(slice)和字典(map)。那是否要編寫自己的數(shù)據(jù)結(jié)構(gòu)呢?要么必須針對(duì)特定類型進(jìn)行設(shè)置,要么需要盯著一個(gè)全是界面的字段{}。這兩種方法都各有所長(zhǎng),但有時(shí)候,我希望我可以只導(dǎo)入類型安全的、通用的、雙向map。
Go將“不需要”發(fā)揮到了極致。“需要”是這里的重點(diǎn)詞。你將“不需要”泛型,但幾乎可以肯定會(huì)需要它們。它在錯(cuò)誤處理,功能編程和運(yùn)算符重載上都是上上之選。
那句“陳詞濫調(diào)”怎么說(shuō)來(lái)著?有時(shí)“少即是多”。除了命名的返回值之外,我想不出Go語(yǔ)言中的任何讓用戶抓狂的功能了。令人印象深刻的是,Go核心開發(fā)人員對(duì)在Go中模仿其他語(yǔ)言的開發(fā)人員群體表現(xiàn)出了極大了約束。Go 2的未來(lái)對(duì)我來(lái)說(shuō)真的很令人興奮,因?yàn)槲液芷诖吹揭呀?jīng)習(xí)慣的“下一代” Go是什么樣子。
對(duì)于Go令人贊嘆的另一點(diǎn)是,它提供了幾乎所有你需要的東西。
go test是一個(gè)很好的基礎(chǔ)測(cè)試框架。你無(wú)需成為JUnit的領(lǐng)域?qū)<遥矡o(wú)需在單元測(cè)試類型之間進(jìn)行選擇。同樣,Go的同步功能涵蓋了你需要的大多數(shù)同步原語(yǔ),http可以提供可用于生產(chǎn)環(huán)境的HTTP服務(wù)器和客戶端(甚至支持HTTP2),而且編碼包中有足夠多的工具可以處理json,xml,csv,以及許多其他常見(jiàn)格式的數(shù)據(jù)。
格式化,格式化,格式化,重要的事情說(shuō)三遍
最后必須說(shuō)到gofmt。在格式化方面,我有點(diǎn)挑剔。我并不特別在乎應(yīng)用哪些規(guī)則,但是我非常在乎一致性。Go的內(nèi)部格式化工具gofmt被社區(qū)廣泛采用,并提供了足夠的一致性,使Go的代碼“看起來(lái)”很用的慣,而不會(huì)看代碼看得要抓狂。
就我個(gè)人而言,我發(fā)現(xiàn)使用gofmt可以輕松閱讀開源Go代碼。盡管每個(gè)項(xiàng)目都有自己的處理方式,但是每個(gè)項(xiàng)目都遵循相同的格式約定。從美學(xué)上講,這讓人愉悅。
所以,我喜歡Go。曾經(jīng)有一段時(shí)間,我被Python的Zen迷住了,并且對(duì)其他語(yǔ)言嗤之以。但現(xiàn)在,我期待Go的美好未來(lái)。我可能以后會(huì)在Rust流行起來(lái)之后,去用Rust趕一波時(shí)髦,因?yàn)槲掖_實(shí)喜歡一些類似于函數(shù)式的編程。
但是現(xiàn)在,我非常愿意繼續(xù)使用Go語(yǔ)言。