我是從 2015 年開始接觸 Golang,并在之后開始在某出行公司的線上環(huán)境大規(guī)模使用,同時個人還利用個人時間深入研究過 Golang 的底層實(shí)現(xiàn)機(jī)制,包括內(nèi)存管理、GC 機(jī)制、Runtime Scheduler、Interface、Channel 等。這篇文章力求客觀的討論一下 Golang 的利弊。
優(yōu)點(diǎn)
1. 簡單
簡單應(yīng)該是 Golang 最大的優(yōu)勢。Golang 的語言特性簡單,學(xué)習(xí)周期短,熟悉其他編程語言的開發(fā)者基本都可以在短時間學(xué)會并寫出各方面都還不錯的代碼。所謂各方面都還不錯是說新手開發(fā)者寫出來的代碼和一些有經(jīng)驗的開發(fā)者寫出來的代碼差別并不會太大。
Golang 語言層面上的簡潔性讓一些新手程序員也能寫出性能不錯,bug 不多的程序,這個相比其他高級語言,比如 C++,是一個非常大的提升。MIT 的一個非常有名的課程 6.824 最開始使用功能的 C++,后來改成了 Golang,就是為了讓大家可以專注于分布式算法本身,而不是陷入到語言細(xì)節(jié)的調(diào)試當(dāng)中去。
2.兼顧開發(fā)效率和性能
Golang 由于豐富的原生庫和周邊生態(tài)的支持,開發(fā)效率甚至可以比肩 Python。很多公司早期,或者項目早期的時候為了趕開發(fā)進(jìn)度都會將開發(fā)效率放在第一位,比如 Python,PHP 這種動態(tài)語言。但是動態(tài)語言的性能劣勢非常明顯?,F(xiàn)在的一個好現(xiàn)象就是 Golang 已經(jīng)越來越多的被小公司采用了,畢竟寫一個 http server 不過三行代碼。
另外在開發(fā)效率的前提下,Golang 還具有非常高的性能。這一方面得益于靜態(tài)語言,另一方面和其本身的語言設(shè)計也有很多關(guān)系。但是這里說的非常高的性能有點(diǎn)不太嚴(yán)謹(jǐn),相比 C++/Java 這種老牌的高級語言,在某些場景下的 benchmark 還是要略遜一籌的。
3. 語言級別的特性支持
所謂語言級別的并發(fā)支持,就是使用 go func 直接啟動一個 goroutine,外加 select/chan 等周邊。在沒有語言級別的支持之前的異步編程簡直就是 callback 噩夢。記得云風(fēng)大神之前對 Golang 的一段評價:
我發(fā)現(xiàn)我花了四年時間錘煉自己用 C 語言構(gòu)建系統(tǒng)的能力,試圖找到一個規(guī)范,可以更好的編寫軟件。結(jié)果發(fā)現(xiàn)只是對 Go 的模仿。缺乏語言層面的支持,只能是一個拙劣的模仿?!?云風(fēng)
現(xiàn)在很多人使用一門新語言的時候,有時候還會問:“有對應(yīng)的 coroutine 庫嗎?” Golang 的語言層面的支持極大的解放了開發(fā)者的心智負(fù)擔(dān)。
缺點(diǎn)
1. runtime
支持 runtime 的編程語言一個無法繞開的問題就是 runtime 帶來的一系列問題,比如性能損耗。在 rust 語言介紹自己的優(yōu)勢的時候有一點(diǎn)就是 no runtime。
Golang 的線程模型調(diào)度是 M:N,runtime 調(diào)度模型是 GMP 模型,偽搶占式的。簡單點(diǎn)來說就是 runtime scheduler 可以類比成操作系統(tǒng),但是缺乏硬件層面上對操作系統(tǒng)的支持,比如硬件中斷,這就對 sheduler 的設(shè)計要求的非常高,但是 Golang 的實(shí)現(xiàn)并沒有想象中的那么好。
2.并不能做到真正高并發(fā)高性能
Golang 的高并發(fā)使用原生庫來實(shí)現(xiàn)的話一般都是通過多 goroutine + select/channel,但是我們看 channel 源碼,發(fā)現(xiàn)這個東西就是一個隊列+一把鎖。這也就意味著無法避免多個 goroutine 帶來的競爭問題。我之前測試過在多個 goroutine 競爭同一個 channel 的時候,性能急劇下降。所以很多高性能的高并發(fā)程序如果是用 Golang 來寫,很多都會避免使用 channel 來傳遞數(shù)據(jù),而是借用類似 disruptor 的 ringbuffer 技術(shù)。
但是這并不是說 Golang 在高并發(fā)場景下性能不行,對于日常的 io 密集型的 web server,可以說性能是足夠了。
其他
這里談一下 Golang 自問世以來一直被詬病的幾個問題。
1. GC
大概從 1.0 版本以來,GC 就一直被詬病。值得欣慰的是,Golang 的 GC 一直在發(fā)展,基本在每個版本都有一定的改進(jìn)。1.8 版本是 GC 的一個里程碑,使用并發(fā)三色標(biāo)記法的 GC 算法的stw 時間甚至達(dá)到了微秒級。目前社區(qū)貌似在討論分代 GC 的方案,這個后面專門寫一篇文章細(xì)說。
2. 包管理
包管理也是一直被詬病,主要是一直沒有一個官方的解決方案。直到去年官方終于開始有行動了,推出了 module,相對來說還是一個很不錯的方案。
3.泛型
Golang 沒有支持泛型的很大一個原因是泛型太復(fù)雜。盡管很多人說 interface 也能實(shí)現(xiàn)泛型功能,但是這個泛型還是有一些本質(zhì)的區(qū)別的。沒有泛型確實(shí)是一個減分項。
-
源碼
+關(guān)注
關(guān)注
8文章
651瀏覽量
29348 -
效率
+關(guān)注
關(guān)注
0文章
149瀏覽量
20081 -
性能
+關(guān)注
關(guān)注
0文章
271瀏覽量
19014
原文標(biāo)題:如何客觀評價 Go 語言?
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論