super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述
點(diǎn)擊上方藍(lán)色“Go語言中文網(wǎng)”關(guān)注我們,領(lǐng)全套Go資料,每天學(xué)習(xí)?Go?語言
Go 語言最近幾年逐漸獲得越來越多的開發(fā)者的喜歡。在 Go 社區(qū)前不久剛剛慶祝Go誕生10周年生日之際,谷歌云軟件工程師 Benjamin Congdon 發(fā)表個人博客(11 月 11 日發(fā)表),表達(dá)了自己對 Go 倍加青睞的一些原因。他表示,“簡潔”是他喜歡使用Go語言最重要的原因。原文鏈接:https://benjamincongdon.me/blog/2019/11/11/The-Value-in-Gos-Simplicity/ 以下是譯文:
使用 Go 幾年后,我真的很欣賞它的簡單性。我?guī)讉€月前開始在工作中使用 Go,發(fā)現(xiàn)它真的很容易實(shí)現(xiàn)迭代,甚至是比 Python 和 Java 更為復(fù)雜的迭代。
當(dāng) Go 社區(qū)慶祝其成立 10 周年(https://blog.golang.org/10years)時,我正在思考是什么使 Go 變得獨(dú)一無二。我認(rèn)為 Go 的許多真正力量來自其設(shè)計(jì)師的理念:高度強(qiáng)調(diào)向前兼容性,該語言沒有損害可讀性的特性,并且隨手可得。你真正需要的一切它都提供了(包括基本測試庫,可靠的聯(lián)網(wǎng)和同步原語以及模板等)。
向前兼容性和依賴性
我認(rèn)為,相較近期的語言,Go 具有最完善的版本控制和依賴關(guān)系。我從未因?yàn)?Go 的版本更新而遇到破壞兼容性的情況。這很重要。在相似的時間段內(nèi),由于 Rust 的 API 更改,臭名昭著的 Python 2 到 3 過渡,我的項(xiàng)目中斷了,老實(shí)說,如果 npm 升級后我的任何舊 JS 項(xiàng)目讓我感到吃驚。
借助 Go,我注意到庫趨于穩(wěn)定,這似乎讓人擔(dān)憂。因?yàn)樵?Python 和 JavaScript 領(lǐng)域,如果你看到 3 年未更新的庫,則表明該庫已死。而在 Go 生態(tài)系統(tǒng)中,你可能可以使用它。在其他社區(qū)中被視為停滯或忽視的事物,在 Go 這里反而是復(fù)興的標(biāo)志。
我還注意到,在 Go 中,我需要更少的依賴項(xiàng),而我的依賴項(xiàng)本身也具有更少的依賴項(xiàng)。Go 沒有將盡可能多的邏輯導(dǎo)出到外部依賴項(xiàng)的文化。Go 社區(qū)比其他地方更容易接受代碼重復(fù)。這可能令人沮喪。有時,你只想要一個執(zhí)行某種類型的環(huán)境或分析的庫。很多時候,你需要自己編寫該功能,或者從 StackOverflow 答案中復(fù)制/粘貼該功能。總的來說,我認(rèn)為這一點(diǎn)還是利大于弊。更少的依賴項(xiàng)意味著項(xiàng)目閑置幾個月之后被迫中斷的可能性更低。
現(xiàn)在,這對于其他語言、社區(qū)可能有點(diǎn)不公平。Rust 尚未達(dá)到 Go 所具有的穩(wěn)定性,這可能是因?yàn)樗€不是一種成熟的語言,但它正朝著這一方向發(fā)展。Python 3 本身已向前兼容,我希望 Python 核心開發(fā)人員能從中學(xué)到關(guān)于硬破損的教訓(xùn)。在這方面,我對 Javascript 不太抱有希望,但是據(jù)說 WebAssembly 和 ES10 將解決我們所有的問題。
Go 的依賴管理并不是沒有問題。有一陣子,dep 和 glide 的破裂確實(shí)很煩人。并且,盡管 Go Modules 很棒,但社區(qū)仍未達(dá)到 100% 的采用率。在使用 Go Modules 之前,將所有內(nèi)容都保留在 $GOPATH 下的要求非常煩人,以至于我推遲了多年進(jìn)入 Go 的工作。現(xiàn)在情況已經(jīng)好轉(zhuǎn)并顯示出改善的跡象。
就向前兼容性而言,自 Go1 發(fā)布以來,所有 Go 代碼都可以得到兼容性的保證[1],這會一直運(yùn)行到 Go2,直到將來的某個不確定的時間點(diǎn)。這是一個強(qiáng)有力的承諾,至少到目前為止,這讓我對這種語言的使用很放心。
“你不需要它”(但你可能想要它)
在使用 Go 一段時間后,我開始想要一些 Go 語言根本不支持的額外功能。嗯,我對 C++ 模板的排斥程度不亞于任何一個人,但是擁有基本的集合類泛型這個要求也不過分,對吧?
開箱即用的唯一兩個通用數(shù)據(jù)結(jié)構(gòu)是切片(slice)和映射(map)。那是否要編寫自己的數(shù)據(jù)結(jié)構(gòu)?要么必須針對特定類型進(jìn)行設(shè)置,要么需要盯著一個全是 interface{} 的字段。這兩種方法都各有所長,但有時候,我希望可以只導(dǎo)入類型安全的、通用的、雙向 map。
Go 將“你根本不需要”[2]發(fā)揮到了極致。“需要”是這里的重點(diǎn)詞。你“不需要”泛型,但幾乎可以肯定你想要它。這樣的語法糖在錯誤處理、函數(shù)式編程和運(yùn)算符重載上都是上上之選。
那句“陳詞濫調(diào)”怎么說來著?有時“少即是多”。除了命名返回值[3]之外,我想不出 Go 語言中的任何讓用戶抓狂的功能了。令人印象深刻的是,Go 核心開發(fā)人員對在 Go 中模仿其他語言的開發(fā)人員群體表現(xiàn)出了極大了約束。Go2[4] 的未來對我來說真的很令人興奮,因?yàn)槲液芷诖吹揭呀?jīng)習(xí)慣的“下一代” Go 是什么樣子。
包括了足夠你需要的
對于 Go 令人贊嘆的另一點(diǎn)是,它提供了幾乎所有你需要的。
go test 是一個很好的(盡管是基本的)測試框架。你無需成為 JUnit 的領(lǐng)域?qū)<?#xff0c;也無需在 nose 和 unittest 之間進(jìn)行選擇。為方便起見,有一些測試斷言庫,例如 testify[5],你可以引入它們,但“你并不必須要”。
類似地,Go 的 sync 包涵蓋了你可能需要的大多數(shù)同步原語,http提供了可用于生產(chǎn)環(huán)境的 HTTP 服務(wù)器和客戶端(甚至支持 HTTP2),而且 encoding 包有足夠多的子包可以處理 json、xml、csv 以及許多其他常見格式的數(shù)據(jù)。
格式化,格式化,格式化(老外也強(qiáng)調(diào)重要的事情說三遍)
最后,如果我不提到gofmt,我會很失落。在格式化方面,我有點(diǎn)挑剔。我并不特別在意使用哪些規(guī)則,但是我非常在乎一致性。Go 的內(nèi)部格式化工具 gofmt 已被社區(qū)廣泛采用,并提供了足夠的一致性,使 Go 的代碼“看起來”符合 Go 的習(xí)語,而不會看代碼看得要抓狂。
就個人而言,我發(fā)現(xiàn)使用gofmt可以更輕松地閱讀開源 Go 代碼。每個項(xiàng)目仍然有自己的處理方式,但是每個項(xiàng)目都遵循相同的格式約定。從美學(xué)上講,這讓人很高興。
所以,我喜歡 Go。曾經(jīng)有一段時間,我對 Zen of Python[6] 非常著迷,并且對其他語言不屑一顧。我期待 Go 的美好未來,我可能以后會在 Rust 流行起來之后,去用 Rust 趕一波時髦,因?yàn)槲掖_實(shí)喜歡一些類似于函數(shù)式的編程。
但是現(xiàn)在,我非常愿意繼續(xù)使用 Go 語言。
文中鏈接
[1]保證: https://golang.org/doc/go1compat
[2]“你根本不需要”: https://www.martinfowler.com/bliki/Yagni.html
[3]命名返回值: http://tour.studygolang.com/basics/7
[4]Go2: https://github.com/golang/go/wiki/Go2
[5]testify: https://github.com/stretchr/testify
[6]Zen of Python: https://www.python.org/dev/peps/pep-0020/
推薦閱讀
深度長文:深入Go Runtime,你能做到淺出嗎?
為什么golang沒有volatile?
喜歡本文的朋友,歡迎關(guān)注“Go語言中文網(wǎng)”:
Go語言中文網(wǎng)啟用微信學(xué)習(xí)交流群,歡迎加微信:274768166
總結(jié)
以上是生活随笔為你收集整理的super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstrap五星评分_如何用纯代码
- 下一篇: mysql查看服务器CPU和内存_怎么查