0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何客觀評(píng)價(jià) Go 語(yǔ)言

Linux愛(ài)好者 ? 來(lái)源:工程師李察 ? 2019-04-25 14:18 ? 次閱讀

我是從 2015 年開(kāi)始接觸 Golang,并在之后開(kāi)始在某出行公司的線上環(huán)境大規(guī)模使用,同時(shí)個(gè)人還利用個(gè)人時(shí)間深入研究過(guò) Golang 的底層實(shí)現(xiàn)機(jī)制,包括內(nèi)存管理、GC 機(jī)制、Runtime Scheduler、Interface、Channel 等。這篇文章力求客觀的討論一下 Golang 的利弊。

優(yōu)點(diǎn)

1. 簡(jiǎn)單

簡(jiǎn)單應(yīng)該是 Golang 最大的優(yōu)勢(shì)。Golang 的語(yǔ)言特性簡(jiǎn)單,學(xué)習(xí)周期短,熟悉其他編程語(yǔ)言的開(kāi)發(fā)者基本都可以在短時(shí)間學(xué)會(huì)并寫(xiě)出各方面都還不錯(cuò)的代碼。所謂各方面都還不錯(cuò)是說(shuō)新手開(kāi)發(fā)者寫(xiě)出來(lái)的代碼和一些有經(jīng)驗(yàn)的開(kāi)發(fā)者寫(xiě)出來(lái)的代碼差別并不會(huì)太大。

Golang 語(yǔ)言層面上的簡(jiǎn)潔性讓一些新手程序員也能寫(xiě)出性能不錯(cuò),bug 不多的程序,這個(gè)相比其他高級(jí)語(yǔ)言,比如 C++,是一個(gè)非常大的提升。MIT 的一個(gè)非常有名的課程 6.824 最開(kāi)始使用功能的 C++,后來(lái)改成了 Golang,就是為了讓大家可以專(zhuān)注于分布式算法本身,而不是陷入到語(yǔ)言細(xì)節(jié)的調(diào)試當(dāng)中去。

2.兼顧開(kāi)發(fā)效率和性能

Golang 由于豐富的原生庫(kù)和周邊生態(tài)的支持,開(kāi)發(fā)效率甚至可以比肩 Python。很多公司早期,或者項(xiàng)目早期的時(shí)候?yàn)榱粟s開(kāi)發(fā)進(jìn)度都會(huì)將開(kāi)發(fā)效率放在第一位,比如 Python,PHP 這種動(dòng)態(tài)語(yǔ)言。但是動(dòng)態(tài)語(yǔ)言的性能劣勢(shì)非常明顯?,F(xiàn)在的一個(gè)好現(xiàn)象就是 Golang 已經(jīng)越來(lái)越多的被小公司采用了,畢竟寫(xiě)一個(gè) http server 不過(guò)三行代碼。

另外在開(kāi)發(fā)效率的前提下,Golang 還具有非常高的性能。這一方面得益于靜態(tài)語(yǔ)言,另一方面和其本身的語(yǔ)言設(shè)計(jì)也有很多關(guān)系。但是這里說(shuō)的非常高的性能有點(diǎn)不太嚴(yán)謹(jǐn),相比 C++/Java 這種老牌的高級(jí)語(yǔ)言,在某些場(chǎng)景下的 benchmark 還是要略遜一籌的。

3. 語(yǔ)言級(jí)別的特性支持

所謂語(yǔ)言級(jí)別的并發(fā)支持,就是使用 go func 直接啟動(dòng)一個(gè) goroutine,外加 select/chan 等周邊。在沒(méi)有語(yǔ)言級(jí)別的支持之前的異步編程簡(jiǎn)直就是 callback 噩夢(mèng)。記得云風(fēng)大神之前對(duì) Golang 的一段評(píng)價(jià):

我發(fā)現(xiàn)我花了四年時(shí)間錘煉自己用 C 語(yǔ)言構(gòu)建系統(tǒng)的能力,試圖找到一個(gè)規(guī)范,可以更好的編寫(xiě)軟件。結(jié)果發(fā)現(xiàn)只是對(duì) Go 的模仿。缺乏語(yǔ)言層面的支持,只能是一個(gè)拙劣的模仿?!?云風(fēng)

現(xiàn)在很多人使用一門(mén)新語(yǔ)言的時(shí)候,有時(shí)候還會(huì)問(wèn):“有對(duì)應(yīng)的 coroutine 庫(kù)嗎?” Golang 的語(yǔ)言層面的支持極大的解放了開(kāi)發(fā)者的心智負(fù)擔(dān)。

缺點(diǎn)

1. runtime

支持 runtime 的編程語(yǔ)言一個(gè)無(wú)法繞開(kāi)的問(wèn)題就是 runtime 帶來(lái)的一系列問(wèn)題,比如性能損耗。在 rust 語(yǔ)言介紹自己的優(yōu)勢(shì)的時(shí)候有一點(diǎn)就是 no runtime。

Golang 的線程模型調(diào)度是 M:N,runtime 調(diào)度模型是 GMP 模型,偽搶占式的。簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是 runtime scheduler 可以類(lèi)比成操作系統(tǒng),但是缺乏硬件層面上對(duì)操作系統(tǒng)的支持,比如硬件中斷,這就對(duì) sheduler 的設(shè)計(jì)要求的非常高,但是 Golang 的實(shí)現(xiàn)并沒(méi)有想象中的那么好。

2.并不能做到真正高并發(fā)高性能

Golang 的高并發(fā)使用原生庫(kù)來(lái)實(shí)現(xiàn)的話一般都是通過(guò)多 goroutine + select/channel,但是我們看 channel 源碼,發(fā)現(xiàn)這個(gè)東西就是一個(gè)隊(duì)列+一把鎖。這也就意味著無(wú)法避免多個(gè) goroutine 帶來(lái)的競(jìng)爭(zhēng)問(wèn)題。我之前測(cè)試過(guò)在多個(gè) goroutine 競(jìng)爭(zhēng)同一個(gè) channel 的時(shí)候,性能急劇下降。所以很多高性能的高并發(fā)程序如果是用 Golang 來(lái)寫(xiě),很多都會(huì)避免使用 channel 來(lái)傳遞數(shù)據(jù),而是借用類(lèi)似 disruptor 的 ringbuffer 技術(shù)。

但是這并不是說(shuō) Golang 在高并發(fā)場(chǎng)景下性能不行,對(duì)于日常的 io 密集型的 web server,可以說(shuō)性能是足夠了。

其他

這里談一下 Golang 自問(wèn)世以來(lái)一直被詬病的幾個(gè)問(wèn)題。

1. GC

大概從 1.0 版本以來(lái),GC 就一直被詬病。值得欣慰的是,Golang 的 GC 一直在發(fā)展,基本在每個(gè)版本都有一定的改進(jìn)。1.8 版本是 GC 的一個(gè)里程碑,使用并發(fā)三色標(biāo)記法的 GC 算法的stw 時(shí)間甚至達(dá)到了微秒級(jí)。目前社區(qū)貌似在討論分代 GC 的方案,這個(gè)后面專(zhuān)門(mén)寫(xiě)一篇文章細(xì)說(shuō)。

2. 包管理

包管理也是一直被詬病,主要是一直沒(méi)有一個(gè)官方的解決方案。直到去年官方終于開(kāi)始有行動(dòng)了,推出了 module,相對(duì)來(lái)說(shuō)還是一個(gè)很不錯(cuò)的方案。

3.泛型

Golang 沒(méi)有支持泛型的很大一個(gè)原因是泛型太復(fù)雜。盡管很多人說(shuō) interface 也能實(shí)現(xiàn)泛型功能,但是這個(gè)泛型還是有一些本質(zhì)的區(qū)別的。沒(méi)有泛型確實(shí)是一個(gè)減分項(xiàng)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    632

    瀏覽量

    29110
  • 效率
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    20026
  • 性能
    +關(guān)注

    關(guān)注

    0

    文章

    270

    瀏覽量

    18950

原文標(biāo)題:如何客觀評(píng)價(jià) Go 語(yǔ)言?

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Go語(yǔ)言簡(jiǎn)介和安裝方法

    Go 又稱 Golang ,是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開(kāi)發(fā)的一種靜態(tài)強(qiáng)類(lèi)型、編譯型語(yǔ)言。Go 語(yǔ)言語(yǔ)法與
    發(fā)表于 07-19 16:33 ?540次閱讀

    Go語(yǔ)言中的整數(shù)類(lèi)型

    Go 語(yǔ)言中,整型可以細(xì)分成兩個(gè)種類(lèi)十個(gè)類(lèi)型。
    發(fā)表于 07-20 15:25 ?862次閱讀

    音頻質(zhì)量客觀評(píng)價(jià)中同步方法的研究與實(shí)現(xiàn)

    在音頻質(zhì)量客觀評(píng)價(jià),尤其是音頻系統(tǒng)的在線評(píng)測(cè)時(shí),參考信號(hào)與測(cè)試信號(hào)不可避免地存在系統(tǒng)延遲。計(jì)算參考與測(cè)試之間的延遲誤差從而實(shí)現(xiàn)信號(hào)之間的時(shí)間同步將是影響音頻質(zhì)量客觀評(píng)價(jià)結(jié)果的關(guān)鍵性問(wèn)題
    發(fā)表于 03-12 00:24

    會(huì)go語(yǔ)言能做什么工作?

    Go語(yǔ)言主要用作服務(wù)器端開(kāi)發(fā),其定位是用來(lái)開(kāi)發(fā)“大型軟件”的,適合于很多程序員一起開(kāi)發(fā)大型軟件,并且開(kāi)發(fā)周期長(zhǎng),支持云計(jì)算的網(wǎng)絡(luò)服務(wù)。Go語(yǔ)言能夠讓程序員快速開(kāi)發(fā),并且在軟件不斷的增長(zhǎng)
    發(fā)表于 03-22 15:03

    Go開(kāi)發(fā)語(yǔ)言的優(yōu)勢(shì)在哪里?

    Go語(yǔ)言是谷歌發(fā)布的第二款開(kāi)源編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,并專(zhuān)門(mén)針對(duì)多處理器系統(tǒng)應(yīng)用程序的編程進(jìn)行了優(yōu)化,開(kāi)發(fā)速度極快,可以與C或C++媲美,而且更加安全、支持并行
    發(fā)表于 03-22 15:04

    基于視覺(jué)信息保真度的圖像增強(qiáng)質(zhì)量客觀評(píng)價(jià)方法_華東

    基于視覺(jué)信息保真度的圖像增強(qiáng)質(zhì)量客觀評(píng)價(jià)方法_華東
    發(fā)表于 03-16 09:15 ?0次下載

    一種新的HDR圖像客觀質(zhì)量評(píng)價(jià)方法

    針對(duì)當(dāng)前高動(dòng)態(tài)范圍( HDR)圖像質(zhì)量評(píng)價(jià)方法未考慮圖像色度和結(jié)構(gòu)信息的問(wèn)題,提出了一種新的HDR圖像客觀質(zhì)量評(píng)價(jià)方法。首先,利用HDR-VDP-2.2中的基于視覺(jué)感知的模型得到關(guān)于亮度與對(duì)比度
    發(fā)表于 12-05 18:58 ?3次下載
    一種新的HDR圖像<b class='flag-5'>客觀</b>質(zhì)量<b class='flag-5'>評(píng)價(jià)</b>方法

    網(wǎng)易有道CEO周楓推薦Go語(yǔ)言并介紹Go語(yǔ)言的3個(gè)優(yōu)點(diǎn)

    網(wǎng)易有道CEO周楓推薦Go語(yǔ)言。他認(rèn)為Go很好地繼承了C語(yǔ)言靈活、簡(jiǎn)單有效的思想;Go有很高的生產(chǎn)效率;
    的頭像 發(fā)表于 01-31 14:11 ?5163次閱讀

    Go語(yǔ)言在世界各地的使用情況如何?

    【導(dǎo)讀】Go語(yǔ)言在世界各地的使用情況如何?數(shù)據(jù)說(shuō)話,帶你直觀感受什么叫“酷小孩都用的語(yǔ)言”! JetBrains 官方博客發(fā)表了一篇題為"The state of Go"的文章,他們通
    的頭像 發(fā)表于 02-26 14:10 ?3982次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語(yǔ)言</b>在世界各地的使用情況如何?

    詳解GO語(yǔ)言的趨勢(shì)與使用情況

    Go 語(yǔ)言簡(jiǎn)單易學(xué)、性能優(yōu)良。JetBrains Blog 發(fā)布了Go 語(yǔ)言的調(diào)查報(bào)告,看看GO 語(yǔ)言
    的頭像 發(fā)表于 03-17 11:05 ?3015次閱讀

    Go語(yǔ)言憑借什么成為云原生第一語(yǔ)言的?

    偶然看到有人說(shuō), Go 語(yǔ)言目前的火爆可能就是曇花一現(xiàn)而已。這個(gè)觀點(diǎn)我當(dāng)然是不認(rèn)同的。 近幾年,關(guān)于 Go 與 Java 還有 C 的對(duì)比和討論愈演愈烈,但不可否認(rèn)的是,在十年多的時(shí)間里,Go
    的頭像 發(fā)表于 04-22 10:15 ?3140次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語(yǔ)言</b>憑借什么成為云原生第一<b class='flag-5'>語(yǔ)言</b>的?

    數(shù)字音頻質(zhì)量主觀評(píng)價(jià)客觀評(píng)價(jià)并存的局面

    鑒于數(shù)字音頻質(zhì)量主觀評(píng)價(jià)的局限性,數(shù)字音頻質(zhì)量的客觀評(píng)價(jià)呼乎之欲出,形成主觀評(píng)價(jià)客觀評(píng)價(jià)并存的
    的頭像 發(fā)表于 06-17 15:11 ?2770次閱讀

    go語(yǔ)言枚舉類(lèi)型怎么用

    go 語(yǔ)言枚舉類(lèi)型是這么用的?在什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語(yǔ)言枚舉做了詳細(xì)講解。 枚舉,是一種重要的數(shù)據(jù)類(lèi)型,由一組鍵值對(duì)組成,通常用來(lái)在編程
    的頭像 發(fā)表于 09-02 09:43 ?5133次閱讀

    帶你了解go語(yǔ)言中的閉包

    ? 【 導(dǎo)讀】什么是閉包? 什么場(chǎng)景下會(huì)用閉包 ? 本文對(duì) go 語(yǔ)言中的閉包做了詳細(xì)介紹。 閉包是由函數(shù)及其相關(guān)引用環(huán)境組合而成的實(shí)體(即:閉包=函數(shù)+引用環(huán)境)。 Go中的閉包 閉包是函數(shù)式
    的頭像 發(fā)表于 11-02 15:27 ?2397次閱讀

    go語(yǔ)言中怎么使用HTTP代理

    go語(yǔ)言中怎么使用HTTP代理。
    的頭像 發(fā)表于 09-01 14:41 ?2380次閱讀