Google軟體工程師:我為什麼喜歡用Go語言?

  • 2019 年 11 月 27 日
  • 筆記

來源:benjamincongdon.me

編輯:大明

本文轉自:新智元

【導讀】Go語言越來越受歡迎,開發者都喜歡Go語言的哪些特點呢?在社區慶祝Go誕生10周年生日之際,Google雲軟體工程師Benjamin Congdon發表個人部落格,表達了自己對Go倍加青睞的一些原因。他表示,「簡潔」是他喜歡使用Go語言最重要的原因。

Go語言最近幾年逐漸獲得越來越多的開發者的喜歡。在Go社區前不久剛剛慶祝Go誕生10周年生日之際,Google雲軟體工程師Benjamin Congdon發表個人部落格,表達了自己對Go倍加青睞的一些原因。他表示,「簡潔」是他喜歡使用Go語言最重要的原因。

以下是部落格內容:

我使用Go已經好幾年了,我最欣賞Go的一點就是它的簡潔性。我在幾個月前開始在工作中使用Go寫程式碼,發現它真的很容易實現迭代,比Python和Java更為複雜的迭代。

當Go社區慶祝10歲生日時,我一直在想,是什麼使Go變得如此與眾不同。我認為Go的許多真正力量來自其設計師的理念:高度強調前向兼容性,該語言沒有損害可讀性的特性,並且隨手可得。它提供了用戶真正需要的一切(基本測試庫,可靠的聯網、同步原語以及模板等)。

前向兼容性有多高、版本依賴性就有多低

我認為,和其它語言相比,Go具有最完善的版本控制和依賴關係。我沒有因為Go的版本更新遇到任何損失。這一點很重要。在差不多的時間段內,由於Rust的API更改,臭名昭著的Python 2到3過渡,我的項目一度陷入了中斷。坦率地說,我覺得npm升級後的任何舊JS項目能不能延續都不好說。

藉助Go,我注意到Go的庫趨於穩定。在Python和JavaScript中,如果有3年未更新的庫,則表明該庫已死。而在Go生態系統中,這個庫可能仍然可以使用。在其他社區中被視為停滯或忽視的事物,在Go這裡反而是復興的標誌。

在Go中,我需要的依賴項更少,而依賴項本身的依賴項也更少。Go沒有將更多的邏輯導出到外部依賴項習慣。Go社區中也更容易接受程式碼重複。有時這一點可能令人沮喪。有時你可能只想要一個執行某種類型的環境或分析的庫。很多時候,你需要自己動手編寫,或者從StackOverflow答案中去尋找。不過總的來說,我認為這一點還是利大於弊。更少的依賴項意味著項目閑置幾個月之後被迫中斷的可能性更低。

不過,現在下結論可能對其他程式語言有點不公平。Rust尚未達到Go所具有的穩定性,這可能是因為Rust還不是一種成熟的語言,但也正朝著逐步成熟方向發展。Python 3本身是向前兼容的,我希望Python核心開發人員能從中學到一些教訓。在這方面,我對Javascript已經不抱什麼希望了。

Go的依附系統也不是沒有問題。儘管GoModules很棒,但社區仍未達到100%的採用率。在使用GoModules之前,將所有內容保存在$ GOPATH下的要求是如此煩人,以至於我推遲了多年才開始使用Go。現在情況已經好轉,開始顯示出逐步改善的跡象。

就向前兼容性而言,Go保證自Go 1發布以來編寫的所有Go程式碼都可以工作到Go 2,直到將來某個不確定的時刻。這是一個強力的承諾,至少到目前為止,我對這種語言的使用體驗還是非常積極的。

一些功能雖然現在不需要,以後可能很想要

在使用Go一段時間後,我開始想要一些Go語言根本不支援的額外功能。嗯,我對C ++模板的排斥程度不亞於任何一個人,但是擁有基本的集合類泛型這個要求也不過分,對吧?

具備「開箱即用」的僅有的兩個通用化數據結構是數組(slice)和字典(map)。那是否要編寫自己的數據結構呢?要麼必須針對特定類型進行設置,要麼需要盯著一個全是介面的欄位{}。這兩種方法都各有所長,但有時候,我希望我可以只導入類型安全的、通用的、雙向map。

Go將「不需要」發揮到了極致。「需要」是這裡的重點詞。你將「不需要」泛型,但幾乎可以肯定會需要它們。它在錯誤處理,功能編程和運算符重載上都是上上之選。

那句「陳詞濫調」怎麼說來著?有時「少即是多」。除了命名的返回值之外,我想不出Go語言中的任何讓用戶抓狂的功能了。令人印象深刻的是,Go核心開發人員對在Go中模仿其他語言的開發人員群體表現出了極大了約束。Go 2的未來對我來說真的很令人興奮,因為我很期待看到已經習慣的「下一代」 Go是什麼樣子。

對於Go令人讚歎的另一點是,它提供了幾乎所有你需要的東西。

go test是一個很好的基礎測試框架。你無需成為JUnit的領域專家,也無需在單元測試類型之間進行選擇。同樣,Go的同步功能涵蓋了你需要的大多數同步原語,http可以提供可用於生產環境的HTTP伺服器和客戶端(甚至支援HTTP2),而且編碼包中有足夠多的工具可以處理json,xml,csv,以及許多其他常見格式的數據。

格式化,格式化,格式化,重要的事情說三遍

最後必須說到gofmt。在格式化方面,我有點挑剔。我並不特別在乎應用哪些規則,但是我非常在乎一致性。Go的內部格式化工具gofmt被社區廣泛採用,並提供了足夠的一致性,使Go的程式碼「看起來」很用的慣,而不會看程式碼看得要抓狂。

就我個人而言,我發現使用gofmt可以輕鬆閱讀開源Go程式碼。儘管每個項目都有自己的處理方式,但是每個項目都遵循相同的格式約定。從美學上講,這讓人愉悅。

所以,我喜歡Go。曾經有一段時間,我被Python的Zen迷住了,並且對其他語言嗤之以。但現在,我期待Go的美好未來。我可能以後會在Rust流行起來之後,去用Rust趕一波時髦,因為我確實喜歡一些類似於函數式的編程。

但是現在,我非常願意繼續使用Go語言。

原文鏈接:

https://benjamincongdon.me/blog/2019/11/11/The-Value-in-Gos-Simplicity/