寫(xiě)了50萬(wàn)行Go代碼是一種什么樣的體驗(yàn)?
大家好,我是 polarisxu。
今天看到一篇文章:看看寫(xiě)了 50 萬(wàn)行代碼的 Gopher 對(duì) Go 有什么感想。我對(duì)其中的核心內(nèi)容進(jìn)行整理,分享給大家!
先簡(jiǎn)單介紹下可汗學(xué)院(Khan Academy)。
這是一個(gè)非營(yíng)利性組織,其使命是在任何地方為任何人提供免費(fèi)的、世界級(jí)的教育。
全球有 6.17 億兒童缺乏基本的數(shù)學(xué)和閱讀技能。可汗學(xué)院是一個(gè)提供他們所需教育的非營(yíng)利組織,因此需要大家的幫助,你的幫忙可以改變一個(gè)孩子的一生。
所以,從網(wǎng)站介紹可以看出,這個(gè)組織主要靠大家的贊助維持運(yùn)營(yíng)。如果你支持這樣的公益事業(yè),可以到官網(wǎng):https://www.khanacademy.org/ 贊助。
從 Python2 遷移到 Go
可汗學(xué)院的項(xiàng)目 Goliath,最開(kāi)始使用 Python2 實(shí)現(xiàn)的,2019 年逐步將其遷移到了 Go。這里有一篇文章介紹了遷移的事情:https://blog.khanacademy.org/go-services-one-goliath-project/。
因?yàn)檫@個(gè)決定,現(xiàn)在可汗學(xué)院所有的后端和全棧工程師都開(kāi)始寫(xiě) Go 代碼,經(jīng)過(guò)幾年的積累,該項(xiàng)目跨域了一個(gè)巨大的里程碑:有超過(guò) 50 萬(wàn)行 Go 代碼在線上運(yùn)行著。這對(duì)于 Go 整個(gè)社區(qū)來(lái)說(shuō)也是一件好事。
工程師很喜歡 Go
可汗學(xué)院的工程師們普遍認(rèn)為「Go 很容易寫(xiě)和讀」,用 Go 越多就越喜歡它。
一個(gè)有多年 .NET 經(jīng)驗(yàn)的工程師說(shuō),Go 的錯(cuò)誤處理和 .NET 的異常處理很不一樣。雖然經(jīng)常要處理 error,但如果一個(gè)函數(shù)沒(méi)有返回錯(cuò)誤,那可以確定它一定成功了,這一點(diǎn)還是很棒的。
此外,他們對(duì) Go 的工具鏈很喜歡。比如通過(guò) go doc 可以查找標(biāo)準(zhǔn)庫(kù)的文檔,特別方便。gofmt 讓代碼格式都一直,很適合閱讀代碼。雖然 Go Module 在社區(qū)抱怨的聲音不少,但相比之前來(lái)說(shuō),還是有很大進(jìn)步,而且可汗學(xué)院在使用過(guò)程中沒(méi)有什么特別差的體驗(yàn)。
同時(shí),他們很喜歡 Go 的編譯速度,那叫一個(gè)快!
泛型,還是需要的
雖然大部分時(shí)候,并不需要泛型。但有時(shí)候,特別是是在寫(xiě)內(nèi)部庫(kù)時(shí),尤其涉及到 slice 時(shí),明顯得感覺(jué)到需要泛型。
沒(méi)有泛型是目前社區(qū)對(duì) Go 抱怨最多的(雖然也有人說(shuō)不需要泛型,有泛型了就不用 Go 了。。。),目前 Go 團(tuán)隊(duì)花了大量的時(shí)間在推進(jìn)泛型。目前已經(jīng)可以嘗鮮,預(yù)計(jì)泛型會(huì)在 1.18 正式發(fā)布。
他們?cè)谶w移 Python 代碼時(shí),有些 Python 的語(yǔ)言結(jié)構(gòu),使用 Go 實(shí)現(xiàn)需要花費(fèi)較多時(shí)間。不過(guò),Go 的語(yǔ)言特性少,使得代碼更一致,可讀性更好。就他們的系統(tǒng),有些特性,需要 2.7 倍的 Go 代碼實(shí)現(xiàn)同樣功能的 Python 代碼。注意,是部分功能。
習(xí)慣了 Python 的人,他們希望 Go 中能夠有更多的高階函數(shù)。隨著泛型的加入,這方面可能會(huì)加強(qiáng),比如計(jì)劃增加的 slices 包。
性能和并發(fā)性
相比 Python,發(fā)現(xiàn) Go 的性能非常優(yōu)秀。盡管遷移過(guò)程中,有點(diǎn)直接從 Python 翻譯到 Go 的感覺(jué),沒(méi)有對(duì) Go 代碼做專門優(yōu)化,但性能表現(xiàn)依然搶眼。優(yōu)化后會(huì)有更好的表現(xiàn)。
其中一名工程師發(fā)現(xiàn),Python 版本中,某些批量數(shù)據(jù)更改每小時(shí)會(huì)產(chǎn)生大約 100 個(gè) Google Cloud Datastore 競(jìng)爭(zhēng)警告,而在 Go 版本中,競(jìng)爭(zhēng)警告接近于零,因?yàn)樗幚頂?shù)據(jù)的速度要快得多。他們有一個(gè)包含 1000 名學(xué)生的課程,在 Python 中加載需要 28 秒,而在 Go 中只需要 4 秒。
雖然他們的 Python 版本時(shí)候單線程的,但 Go 版本還是使用了并發(fā)的特性。
Go 官方一般推薦使用 Goroutine + Channel,但可汗學(xué)院發(fā)現(xiàn),他們使用 sync 包的數(shù)量遠(yuǎn)超 channel,不知道這種情況將來(lái)會(huì)不會(huì)改變。
50 萬(wàn)行代碼后的總結(jié)
一般來(lái)說(shuō),實(shí)現(xiàn)同樣的功能,Go 代碼會(huì)比 Python 多; 但 Go 的速度快,工具好用,而且在線上運(yùn)行穩(wěn)定、良好;
雖然可汗學(xué)院的工程師有不同的背景,對(duì) Go 和其他語(yǔ)言也有不同的看法。經(jīng)過(guò)這段時(shí)間的磨合,目前看,對(duì) Go 他們還算滿意。
你寫(xiě)了多少 Go 代碼?你對(duì) Go 的感受是什么?
推薦閱讀
