RM新时代网站-首页

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

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

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

GO語言簡介!GO是理想的編程語言嗎?

電子工程師 ? 來源:lq ? 2019-04-29 09:47 ? 次閱讀

第一次接觸GO是5年前,14年4月份,也是在我司,全職鉆研一周,彼時C++中毒太深,內(nèi)心排斥其他編程語言,看其他語法總覺得有點怪,而且有“C/C++能做任何事,故無用其他語言之必要”的思想在作祟。

我讀研階段用過幾年Java,工作以來一直使用C++/C,況且教出幾個非計算機系(包括英語系)的職業(yè)程序員,所以,我就浮夸一回,聲稱熟練掌握C++吧。

人都有思維定勢,受限于自己的經(jīng)驗和認知,我亦不能例外,但好在我意識到這一點,所以在調(diào)研過程中,努力摒棄成見,盡量擺脫慣性,查閱關(guān)于GO的各種(包括核心設(shè)計師)文章,傾聽擁躉和批評者的不同聲音,結(jié)合自己的思考和分析,力求客觀公正去評價GO。

▌GO語言簡介

GO是Google開發(fā)的一種靜態(tài)、強類型、編譯型、并發(fā)型,并具有垃圾回收功能的類C編程語言。2009以開源項目的形式發(fā)布,2012年發(fā)布1.0穩(wěn)定版本,距今已經(jīng)十年了。

發(fā)明一種新的編程語言,首先得找到必要性,不然肯定會被質(zhì)疑重復(fù)造輪子,方法嘛?無非是先找某種語言的一些茬,吐槽一番,復(fù)雜、笨拙、低效,太TM沙雕了,不能忍,勞資要立刻馬上分分鐘擼出一種新的編程語言,完美解決所有問題,不然對不起我卓爾不群的智商。

GO的故事也很套路,G公司Pike大牛聽完C++0x的演講,回到辦公室,開始編譯C++,等待編譯過程中,轉(zhuǎn)過椅子面向Robert,討論語言的問題,然后拉上Ken爺爺一起合計,群嘲之后,受不了C++某些沙雕設(shè)計,還沒等編譯完成,三個老男人便一拍即合,決定一起搞點change the world的偉大事情,于是乎,GO誕生了。

GO語言之父Pike提到:GO語言是以C為原型,以C++為目標而設(shè)計的,希望C++程序員能以GO作為替代品。因為他覺得C++忒復(fù)雜了,要解救程序員于水火。

雖然GO以C++為目標而設(shè)計,但尷尬的是,Pike坦承GO并沒有吸引來多少C++程序員,反而是吸引了不少Python、Ruby程序員。這、這、這、這。

▌GO核心團隊

G公司不差錢不缺人,GO團隊更是群星薈萃、大咖云集,不廢話,直接上圖:

核心設(shè)計師Pike和Ken都是出身自貝爾實驗室,Ken之于Pike,亦師亦友,共同發(fā)明了UTF-8,還基情四射地結(jié)對編程過,感情好的穿一條褲子。

Pike是Unix先驅(qū),貝爾實驗室最早跟Ken、Dennis一起開發(fā)Unix的猛人,Plan9 OS的靈魂人物。大胡子Ken爺爺則是Unix之父,和Dennis一起發(fā)明了C語言,殿堂骨灰級程序員,早已是名滿天下。

技術(shù)實力毋容置疑,不過這哥倆都是玩Kernel的,經(jīng)歷相同,理念相近,分歧會比較少,他們也都坦承C用得最多最熟,所以注定了GO的類C特性,不過這會不會導致GO設(shè)計上的思維火花不足,對OOP以及現(xiàn)代編程思想的支持不足,亦未可知。

▌GO的哲學

哲學是難分對錯的,GO有GO的哲學,有它的取舍和審美,不一定每個人都認同,我覺得還挺有道理的,羅列如下:

少即是多

GO信奉:Less Is More,大道至簡,臆測是喬幫主的信徒。

世界是并行的

世間萬物是并行發(fā)生的,所以GO遵照這個規(guī)律,對并發(fā)的原生支持讓GO更易于描述并行世界。

世界是物質(zhì)組成的

微觀世界由小的粒子組合成大的粒子;宏觀世界由小的物體組合成大的物體。繼承只能描述現(xiàn)實世界的一小部分,使用繼承是不全面的;GO的設(shè)計選擇的是組合,這個和現(xiàn)實世界比較吻合的設(shè)計,表現(xiàn)力更強。

世界是標準化的

硬件是標準化的,軟件也應(yīng)如此,GO的接口是DUCK模型,接口是非侵入式的。

正交性

GO的多個特性都是正交性的,正交性是保持事物穩(wěn)定和簡單的最好設(shè)計。

二八定律

80%代碼只使用20%特性,增加語言特性,并不能提升效率,反而會增加復(fù)雜性,提高犯錯率,加重程序員心智負擔。

統(tǒng)一格式化

C++語法自由自在,于是乎一群吊絲為tab or space、大括號要不要換行等諸如此類的格式問題吵得不可開交。GO設(shè)計師認為,都是吃飽了撐的,你們太愚蠢了。

于是GO規(guī)定左大括號{不能換行放置,沒有為什么,對著干直接編譯不過。

GO編譯器內(nèi)建工具gofmt強制源碼格式化。對不起,沒有選項,我的地盤聽我的,把精力focus到真正重要的事情上來,停止無意義的爭吵。

這其實也是一種哲學:給你(我認為)最好的,而不是給你選擇。就像iPhone一樣,用戶太笨了,他們根本不知道自己需要什么,就讓幫主替你安排好一切吧。

不過GO強加個人喜好的一刀切做法,也招致批評和厭惡。有比較剛的程序員,直接因為大括號不讓換行而拋棄GO。

作為一個經(jīng)歷過各種妖媚代碼格式要求的程序員,我發(fā)出了杠鈴般的笑聲。

▌GO的特色

GO是介于C與C++之間的語言,比C抽象層次高,比C++抽象層次低。

因為是一門新的編程語言,站在巨人的肩膀,博采眾長,規(guī)避了一些已知的問題,開發(fā)了一些優(yōu)秀的特征,相比C/C++,GO的核心特征包括以下幾個方面:

1. 原生并發(fā),以東尼·霍爾的通信順序進程(CSP)為基礎(chǔ)的goroutine,適合現(xiàn)代多核機器

2. 垃圾回收,非常高效(請來世界頂級內(nèi)存管理專家設(shè)計)

3. 強大的標準庫,對網(wǎng)絡(luò)編程等的良好支持

4. CGO提供了GO調(diào)用C機制,擴展了GO的能力邊界

5. 內(nèi)嵌關(guān)聯(lián)數(shù)組

6. 非侵入式的接口設(shè)計

7. 簡單清晰的語法,以及強編碼規(guī)則,好處可能遠超想象

▌GO vs C/C++

[GO與C語法詳細對比](http://hyperpolyglot.org/c)

▌性能對比

雖然GO號稱兼?zhèn)銫++的運行效率和PHP的開發(fā)效率,但benchmarks好像打臉了,從數(shù)據(jù)上看,GO的運行效率接近卻略低于Java。

▌研發(fā)效率

我樂觀預(yù)計GO的研發(fā)效率上優(yōu)于C/C++,特別是*nix環(huán)境下。

▌流行度

GO獲得TIOBE 2016年度最佳,2017年10月獲得第10,歷史最高排名。

GO誕生10年,雖然背靠Google,但依然沒有挺進編程語言第一陣營 ,屬于外圍三線。

近一年多流行度排名有所下滑,鐵打的Java、C/C++,流水的編程語言。

▌工程化水平

知名項目:

Docker:大名鼎鼎的開源應(yīng)用容器引擎

K8S:容器編排管理系統(tǒng)的事實標準

...

GO更適合開發(fā)服務(wù)器端大型軟件,高性能分布式系統(tǒng)領(lǐng)域,網(wǎng)絡(luò)編程,并發(fā)編程,被譽為云時代的C語言。

GO成為云計算時代流行起來,促進了云計算的發(fā)展,Google用GO的多,今日頭條、Uber等公司也用GO對業(yè)務(wù)進行了徹底的重構(gòu),golang.org YouTube.com也在使用GO開發(fā)。

美國市值TOP20有一半在使用GO,國外很多初創(chuàng)公司選擇GO,國內(nèi)關(guān)注高,但還未得到廣泛應(yīng)用,應(yīng)用上呈現(xiàn)國外熱國內(nèi)冷的特點。

Go語言目前所面臨的最大問題在于,還沒有足夠的經(jīng)驗來證明GO是否真的是一個成功的產(chǎn)品,缺少足夠多超大型應(yīng)用的實踐。

總體而言,GO的工程化水平低于C/C++和Java等第一梯隊語言。

▌爭議和不足

GO最初聲稱為了解決Google的問題而設(shè)計,為了幫助人們閱讀、調(diào)試和維護軟件而生,但目前為止,難言圓滿。

GO的異常處理經(jīng)常被吐槽,GC提高了安全性卻失去了控制力,組合代替繼承真的好嗎?包管理做的好嗎?

摒棄先入為主的觀念影響,重新客觀審視GO語言,我覺得在語言設(shè)計層面,GO確實更自然、更簡約。比如摒棄行尾的分號,比如if/for不需要圓括號包裹條件,放空內(nèi)心去想,好像真的更合理。

GO抖掉了C++的諸多包袱,讓程序簡單,也更容易理解(特別是相對于C),但是隨著GO的發(fā)展,語法也有可能變重,比如GO 2.0版又把它之前批評的泛型引入了,當初GO批評別人的點又有可能反過來被別人批評。

而關(guān)于語法層面是否真的更簡潔,也是有爭議的,三目運算符不支持+強制大括號讓一行C代碼變成多行GO真的更簡單了嗎?比如編程語言專家莊曉立(Liigo)在CSDN上有吐槽的文章,仔細讀來,也有一定道理,我貼一個鏈接,可以參考一下。

原文鏈接:https://blog.csdn.net/liigo/article/details/23699459

另外GO是G公司的,雖然目前開源,但會不會哪天也像Oracle一樣,窮瘋了便開始薅羊毛,Oracle Java JDK已經(jīng)開始割韭菜了,所以GO智慧產(chǎn)權(quán)的風險依然存在,而C/C++已經(jīng)是宇宙人類的了,世界性的標準化組織在控制管理,風險無窮逼近于零。

▌小結(jié)

GO在一些點確實有突破,比如讓并發(fā)編程更容易、運行更高效,比如垃圾回收讓程序更安全,比如基于消息(Channel)編程的支持,比如內(nèi)嵌關(guān)聯(lián)結(jié)構(gòu),這些都很贊,也很重要。編程語言發(fā)展這么多年,任何突破都是艱難和寶貴的。

Goroutine是GO的殺手锏,經(jīng)過GO改造后的系統(tǒng)有更高并發(fā)量和IO吞吐率。

GO跟C非常像,這并不奇怪,因為設(shè)計師都是C語言大師,C/C++程序員很容易切換到GO,但Java程序員轉(zhuǎn)GO可能要困難一些。

另一個隱患就是在Java占主導的生態(tài)中,GO顯得比較小眾,跟其他中間件的融合也存在潛在風險,引入復(fù)雜性甚至混亂。

回到標題的問題,GO是更好的語言嗎?GO是理想的編程語言嗎?說實話,我不知道,而且我的觀點也不重要,這似乎是一個哲學問題。

是否要選擇GO作為項目開發(fā)語言,我認為不應(yīng)該被GO聲稱的優(yōu)勢迷惑,因為你去google任何一門語言,都能收獲一堆優(yōu)點,PR會自然而然的對缺點選擇性忽視。

但也不能因循守舊,而應(yīng)該仔細辨別,你度量什么便得到什么。GO是否適合你的項目,GO的新特點和優(yōu)勢對你的項目是否真有必要,是否真有幫助,能給你的項目帶來什么好處?比如你寫一個單機游戲程序可能GO網(wǎng)絡(luò)庫的簡便對你而言為零,所得收益跟你付出新學一門語言的成本相比如何?同時,它的缺陷是什么?你是否全面理解?

有時候,它或許就像一位花枝招展的姑娘,待你拋棄一切去擁抱它的時候,你會發(fā)現(xiàn),它的美好只是存在于你的幻想中,當然也有另一種可能,它真的非常好,很適合你,恭喜你,熱情的擁抱它吧。

GO有它適應(yīng)場景,比如適合網(wǎng)絡(luò)程序、云應(yīng)用、微服務(wù)、高性能分布式、大型多人協(xié)同,可能在開發(fā)效率上有非常大的提升,清晰度上也有提高,可能是理想的首選。

或許我會嘗試用GO開發(fā)新項目或者改寫老項目,誰知道呢?這取決于權(quán)衡折中,取決于領(lǐng)導決斷,也取決于我的心情。

▌附錄

一段GO的示例代碼,品味一下GO的STYLE

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

    關(guān)注

    10

    文章

    1942

    瀏覽量

    34707
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73618
  • go語言
    +關(guān)注

    關(guān)注

    1

    文章

    158

    瀏覽量

    9047

原文標題:Go是更好的編程語言嗎?

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Go語言簡介和安裝方法

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

    Go語言中的整數(shù)類型

    Go 語言中,整型可以細分成兩個種類十個類型。
    發(fā)表于 07-20 15:25 ?913次閱讀

    go語言能做什么工作?

    讓程序員更容易地進行維護和修改。它融合了傳統(tǒng)編譯型語言的高效性和腳本語言的易用性和富于表達性。Go語言作為服務(wù)器編程
    發(fā)表于 03-22 15:03

    Go開發(fā)語言的優(yōu)勢在哪里?

    Go語言是谷歌發(fā)布的第二款開源編程語言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,并專門針對多處理器系統(tǒng)應(yīng)用程序的編程進行了優(yōu)化,開
    發(fā)表于 03-22 15:04

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

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

    Go和Python,Erlang的語言對比分析和Go編程示例概述

    本文對Go和Python、Erlang做了一些有趣的分析對比,相信大家能從中感受到Go語言的強大和與眾不同。
    的頭像 發(fā)表于 07-21 09:52 ?7727次閱讀
    <b class='flag-5'>Go</b>和Python,Erlang的<b class='flag-5'>語言</b>對比分析和<b class='flag-5'>Go</b><b class='flag-5'>編程</b>示例概述

    學習Go語言PDF電子書免費下載

    這是關(guān)于來自Google 的Go語言簡介。目標是為這個新的、革命性的語言提供一個指南。
    發(fā)表于 08-29 16:30 ?9次下載
    學習<b class='flag-5'>Go</b><b class='flag-5'>語言</b>PDF電子書免費下載

    華為云的Go語言編程的眾多干貨

    ? 近日,國內(nèi)較權(quán)威的Go大會——Gopher China召開,眾多一線互聯(lián)網(wǎng)公司的大神們匯聚一堂,深入探討了Go語言并產(chǎn)生了諸多干貨。其中,華為云微服務(wù)首席架構(gòu)師田曉亮老師也受邀參與本次大會,以
    的頭像 發(fā)表于 12-17 17:59 ?2214次閱讀

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

    開發(fā)者 數(shù)量 所處地區(qū) ? 全球大約有 110 萬名職業(yè) Go 開發(fā)者(特指在工作中專門將 Go 作為主力編程語言的群
    的頭像 發(fā)表于 02-26 14:10 ?4056次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>在世界各地的使用情況如何?

    詳解GO語言的趨勢與使用情況

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

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

    發(fā)展勢頭強勁,憑借其簡潔、高效的特性,在競爭激烈的編程語言市場中占據(jù)了一席之地。 如果你對 Go 的發(fā)展趨勢還不明朗的話,不妨仔細看看我后面說的。 據(jù) StackOverflow(全球最大的
    的頭像 發(fā)表于 04-22 10:15 ?3183次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>憑借什么成為云原生第一<b class='flag-5'>語言</b>的?

    go語言枚舉類型怎么用

    go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細講解。 枚舉,是一種重要的數(shù)據(jù)類型,由一組鍵值對組成,通常用來在
    的頭像 發(fā)表于 09-02 09:43 ?5174次閱讀

    帶你了解go語言中的閉包

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

    go語言中怎么使用HTTP代理

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

    Go編程語言-你應(yīng)該知道的一切

    Go 編程語言的故事始于 Google,當時三位工程師 Robert Griesemer、Rob Pike 和 Ken Thompson 對 C++ 的復(fù)雜性以及缺乏提供高效編譯和執(zhí)行的簡單
    的頭像 發(fā)表于 12-11 17:37 ?650次閱讀
    RM新时代网站-首页