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