溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go語言的優(yōu)勢和劣勢是什么

發(fā)布時(shí)間:2022-12-27 11:00:24 來源:億速云 閱讀:164 作者:iii 欄目:編程語言

這篇“go語言的優(yōu)勢和劣勢是什么”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“go語言的優(yōu)勢和劣勢是什么”文章吧。

go語言的缺點(diǎn):1、技術(shù)路線選擇導(dǎo)致的“性能劣勢”,go屬于GC類編程語言,在一些性能超級敏感的場合,選擇Go依然要慎重。2、表達(dá)方法單一”、顯式的錯誤處理有點(diǎn)“過時(shí)”。3、最小版本選擇MVS,背離主流。4、Go核心團(tuán)隊(duì)對語言演化的把控力十足,不是社區(qū)多數(shù)人贊同的就一定會被采納而加入Go語言,導(dǎo)致在社區(qū)上有劣勢,Go社區(qū)與Go核心團(tuán)隊(duì)有“裂痕”。5、功能孱弱。

每種編程語言都有自己的優(yōu)勢和劣勢,Go也不例外,下面我們就來列舉一下Go的那些“優(yōu)勢”和“劣勢”:

Go優(yōu)勢

1、簡單易學(xué)

Go語言語法簡單,其中包含了類似C語言的語法。如果讀者已經(jīng)掌握了兩到三門編程語言,那么學(xué)習(xí)Go語言只需要幾天的時(shí)間。即使是一名剛?cè)腴T的開發(fā)者,花幾個(gè)星期也能寫出性能較高的Go語言程序。

2、自由高效

Go語言的編譯速度明顯優(yōu)于 Java 和 C++,還擁有接近C語言的運(yùn)行效率以及接近 PHP 的開發(fā)效率,可以說Go語言將運(yùn)行效率和開發(fā)效率進(jìn)行了完美的融合。

同時(shí),Go語言還支持當(dāng)前所有的編程范式,包括過程式編程、面向?qū)ο缶幊?、面向接口編程、函?shù)式編程。開發(fā)者們可根據(jù)需求自由組合。

3、強(qiáng)大的標(biāo)準(zhǔn)庫

Go里面的標(biāo)準(zhǔn)庫非常穩(wěn)定并且豐富多樣,包括網(wǎng)絡(luò)、系統(tǒng)、加密、編碼、圖形等各個(gè)方面。尤其是網(wǎng)絡(luò)和系統(tǒng)的庫非常實(shí)用,使得開發(fā)者在開發(fā)大型程序時(shí),幾乎無須依賴第三方庫。

4、部署方便

不需要使用虛擬機(jī),Go語言的代碼可以直接輸出為二進(jìn)制可執(zhí)行文件。而且Go語言擁有自己的鏈接器,不依賴任何系統(tǒng)提供的編譯器和鏈接器。因此編譯出的二進(jìn)制可執(zhí)行文件幾乎可以運(yùn)行在任何系統(tǒng)環(huán)境中。

5、原生支持并發(fā)

Go語言是一種非常高效的語言,從語言層原生支持并發(fā),使用起來非常簡單。Go語言的并發(fā)是基于 Goroutine 的,Goroutine 類似于線程,但并非線程,是Go語言面向線程的輕量級方法。創(chuàng)建 Goroutine 的成本很低,只需幾千個(gè)字節(jié)的額外內(nèi)存。

通常一臺普通的桌面主機(jī)運(yùn)行上百個(gè)線程就會負(fù)載過大,而同樣的主機(jī)卻可以運(yùn)行上千甚至上萬個(gè) Goroutine。Goroutine 之間可以通過 channel 實(shí)現(xiàn)通信。Goroutine 以及基于 channel 的并發(fā)性方法可最大限度地使用 CPU 資源。

6、穩(wěn)定性強(qiáng)

Go語言擁有強(qiáng)大的編譯檢查、嚴(yán)格的編碼規(guī)范和很強(qiáng)的穩(wěn)定性,此外Go語言還提供了軟件生命周期(如開發(fā)、測試、部署、維護(hù)等)的各個(gè)環(huán)節(jié)的工具,例如:go tool、go fmt、go test 等。

7、垃圾回收

在使用Go語言進(jìn)行開發(fā)時(shí),在內(nèi)存方面開發(fā)者只需要關(guān)注內(nèi)存的申請即可,并不需要關(guān)系內(nèi)存的釋放,因?yàn)镚o語言內(nèi)置了 runtime 來自動進(jìn)行管理。雖然目前來說 GC(Garbage Collection,垃圾回收機(jī)制)不算完美,但是足以應(yīng)付開發(fā)時(shí)遇到的大多數(shù)情況,使開發(fā)者可以將更多精力集中在業(yè)務(wù)上,同時(shí)Go語言也允許開發(fā)者對此項(xiàng)工作進(jìn)行優(yōu)化。

Go的劣勢

1. 技術(shù)路線選擇導(dǎo)致的“性能劣勢”

眾所周知,Go是帶垃圾回收的編程語言,因此不管Go的STW(Stop The World)的時(shí)間有多么短,GC的延遲有多么的小,它依然屬于GC類編程語言,和Java、C#屬于一個(gè)陣營,同時(shí)天然與C、C++、Rust這樣的手動管理內(nèi)存、沒有運(yùn)行時(shí)GC負(fù)擔(dān)的編程語言之間劃清了界線。雖然Go語言的初衷是成為系統(tǒng)級編程語言,雖然Go的運(yùn)行時(shí)性能可以滿足99.99%的場合的需要,雖然百度的萬億流量[轉(zhuǎn)發(fā)引擎BFE]、時(shí)序數(shù)據(jù)庫[influxdb]、分布式關(guān)系數(shù)據(jù)庫[TiDB]等性能敏感的項(xiàng)目都選擇了用Go實(shí)現(xiàn),但不能否認(rèn)的是在一些性能超級敏感的場合,選擇Go依然要慎重。

2 堅(jiān)持自己的設(shè)計(jì)哲學(xué)所帶來的“表達(dá)劣勢”

1) “單一”的表達(dá)方法

很多從其他語言轉(zhuǎn)到Go陣營的開發(fā)人員抱怨Go能玩的花樣太少,套路不多,Go之所以表現(xiàn)出“表達(dá)劣勢”,源于其設(shè)計(jì)哲學(xué)中的一個(gè)原則:“崇尚一個(gè)事情只有一個(gè)或少數(shù)幾種寫法”。這個(gè)原則不符合某些開發(fā)人員炫技的心理需求,于是Go就被詬病為是資質(zhì)平平的程序員才會去用的語言。

[Go 1.18將加入泛型(類型參數(shù))],這算是對此類“劣勢”的一個(gè)“彌補(bǔ)”。不過對于我們這些對Go價(jià)值觀和設(shè)計(jì)哲學(xué)認(rèn)同已久的Gopher而言,我們十分擔(dān)心大幅提高Go表達(dá)能力的[泛型]將成為奇技淫巧的“滋生地”。

2) “過時(shí)”的顯式的錯誤處理

Go語言從誕生那天起就沒有像C++、Java、Python等主流編程語言那樣提供基于異常(exception)的結(jié)構(gòu)化try-catch-finally錯誤處理機(jī)制,Go的設(shè)計(jì)者們認(rèn)為[將異常耦合到程序控制結(jié)構(gòu)中會導(dǎo)致代碼混亂]。Go提供了一種簡單的基于錯誤值比較的錯誤處理機(jī)制,這“強(qiáng)迫”每個(gè)Go開發(fā)人員都必須顯式地去關(guān)注和處理每個(gè)錯誤,經(jīng)過顯式錯誤處理的代碼會更為健壯,也會讓Go開發(fā)人員對這些代碼更有信心。但這一設(shè)計(jì)哲學(xué)的堅(jiān)持卻被很多來自其他語言的開發(fā)者嘲笑為“過時(shí)”,被稱為“半個(gè)世紀(jì)前的古老機(jī)制”。(筆者注:十九世紀(jì)70年代C語言誕生時(shí)采用的錯誤處理機(jī)制)

Go開發(fā)團(tuán)隊(duì)也曾“動搖過”,Go開發(fā)團(tuán)隊(duì)在發(fā)布Go2計(jì)劃后曾發(fā)布過多版[Go錯誤處理的新機(jī)制草案]。Go社區(qū)也針對此問題做過長時(shí)間的討論甚至是“爭吵”,知名Gopher Dave Cheney發(fā)聲、Rob Pike發(fā)聲,著名Go培訓(xùn)師、《Go語言實(shí)戰(zhàn)》聯(lián)合作者之一的威廉·肯尼迪(William Kennedy)更是在Go團(tuán)隊(duì)try 提案公示之后,發(fā)表了對Go社區(qū)的公開信反對try方案,最終堅(jiān)持Go設(shè)計(jì)哲學(xué)的一派占據(jù)了上風(fēng),try提案被否決,沒有加入到[Go 1.13版本]中!

3. 背離主流的“小眾劣勢”

Go早期設(shè)計(jì)的包依賴管理機(jī)制的確存在不小的“瑕疵”,這源于Google內(nèi)部大單一代碼倉庫與基于主干的開發(fā)模型的影響。走出Google的Go語言聽到了不同方面的聲音,Go包管理機(jī)制長期無法滿足社區(qū)的需求。于是先后出現(xiàn)了[vendor機(jī)制]、[dep]等對包依賴管理的改進(jìn)嘗試。

2018 年初,正當(dāng)廣大gopher們認(rèn)為dep將“順理成章”地升級為go官方工具鏈的一部分的時(shí)候,Go核心團(tuán)隊(duì)的技術(shù)負(fù)責(zé)人,也是Go 核心團(tuán)隊(duì)早期成員之一的Russ Cox在個(gè)人博客上連續(xù)發(fā)表了[七篇文章],系統(tǒng)闡述了Go團(tuán)隊(duì)解決“包依賴管理” 的技術(shù)方案: [vgo],即go module的前身。

vgo的主要思路包括:語義導(dǎo)入版本 (Semantic Import Versioning)、 最小版本選擇 (Minimal Version Selection) ,這些都與當(dāng)前主流編程語言的包依賴管理的規(guī)則相悖,尤其是[最小版本選擇(MVS)],算是另辟蹊徑,背離主流!

4. Go核心團(tuán)隊(duì)的“民主集中制”導(dǎo)致的“社區(qū)劣勢”

和Rust團(tuán)隊(duì)廣泛采納社區(qū)建議“猛加語言特性”不同,Go像是另外一個(gè)極端:Go核心團(tuán)隊(duì)對語言演化的把控力十足,不是社區(qū)多數(shù)人贊同的就一定會被采納而加入Go語言,我這里將其戲稱為“民主集中制”吧,即真正的投票權(quán)其實(shí)在Go核心團(tuán)隊(duì)的代表社區(qū)的少數(shù)人手中。

2018年初的dep與vgo之爭就是這一“劣勢”的典型表現(xiàn)。社區(qū)費(fèi)勁一年多努力精心打造的dep項(xiàng)目被Russ Cox等少數(shù)人集中花掉一些時(shí)間設(shè)計(jì)出的vgo給“擠出”了Go包依賴管理工具標(biāo)準(zhǔn)的位置,成為了Go module成功的“墊腳石”。即便最終證明Go團(tuán)隊(duì)使用go module的決策的結(jié)果是正確的,但 這導(dǎo)致的Go社區(qū)與Go核心團(tuán)隊(duì)的“裂痕”是確確實(shí)實(shí)存在的,以致于這兩年Go核心團(tuán)隊(duì)極力改善與Go社區(qū)的關(guān)系,規(guī)范化和透明化Go proposal的提出、review和接納流程。

5. 全面出擊失敗后,期望的落空導(dǎo)致的“功能孱弱劣勢”

Go 1.5發(fā)布之后,由于實(shí)現(xiàn)了自舉和GC延遲的大幅下降,Go受關(guān)注程度逐漸升高,直至2017年初第二次拿到TIOBE年度最佳編程語言,讓Go語言有些“膨脹”,甚至狂熱的Go鼓吹者曾一度希望Go一統(tǒng)江湖:不僅牢牢把持住自己的云原生市場,占領(lǐng)Java的企業(yè)級市場,還要在終端(android. ios)、前端(js)上擊敗現(xiàn)有對手。

有人可能覺得我的上述說法可笑,但這些說法并非空穴來風(fēng)。Go語言在終端、前端方面還真的曾經(jīng)發(fā)過力,了解Go歷史的都知道,Go團(tuán)隊(duì)曾經(jīng)有全職開發(fā)人員參與[gomobile項(xiàng)目](,該項(xiàng)目旨在構(gòu)建在Android和iOS上的Go技術(shù)棧,實(shí)現(xiàn)用Go語言編寫終端應(yīng)用的目的。

在前端方面,[gopherjs項(xiàng)目]可以將go代碼編譯為js代碼并運(yùn)行于各大瀏覽器中。后來gopherjs的作者又幫助go項(xiàng)目原生支持webassembly,支持將go編譯為webassembly運(yùn)行在瀏覽器中。

但上面的嘗試最終沒能“得償如愿”,現(xiàn)狀是在終端、前端應(yīng)用領(lǐng)域,使用Go編碼的人少之又少。于是Go又逐漸冷靜下來,回到自己擅長的主力戰(zhàn)場,回歸到了企業(yè)級應(yīng)用、基礎(chǔ)設(shè)施、中間件、微服務(wù)、命令行應(yīng)用等領(lǐng)域,并且在這些領(lǐng)域取得了越來越多開發(fā)者的青睞。

但曾經(jīng)的全面出擊失敗給很多開發(fā)者留下了“Go功能孱弱”的口實(shí),甚至有人說[親爹Google]也沒能讓親兄弟Android給Go走個(gè)后門。

以上就是關(guān)于“go語言的優(yōu)勢和劣勢是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI