Go語言相對於C++的優點

来源:https://www.cnblogs.com/zgwu/archive/2019/02/17/10393187.html
-Advertisement-
Play Games

Go語言是Google公司在2009年開源的一門高級編程語言,它為解決大型系統開發過程中的實際問題而設計,支持併發、規範統一、簡單優雅,被很多Go語言傳道者譽為“互聯網時代的C語言”。而C++語言誕生於1979年,可以將C++語言視為一個語言聯邦,主要包含C語言(面向過程)、面向對象、STL容器和算 ...


Go語言是Google公司在2009年開源的一門高級編程語言,它為解決大型系統開發過程中的實際問題而設計,支持併發、規範統一、簡單優雅,被很多Go語言傳道者譽為“互聯網時代的C語言”。而C++語言誕生於1979年,可以將C++語言視為一個語言聯邦,主要包含C語言(面向過程)、面向對象、STL容器和演算法、範型編程(模板)4部分,它高效強大同時又臃腫複雜,目前最流行的是C++11標準,它的很多優化為C++註入了新的活力。 

谷歌出品,必屬精品。Go語言流行至今,大有顛覆C++和Java在大型系統開發中的霸主地位的趨勢,這篇文章簡要分析Go語言相對於C++的優點,內容主要來自個人感悟,如有不對的地方還請朋友們批評指正。 

1、語法規範。Go語言實現了語法規範的高度統一,例如Go語言規定大寫字母開頭是公開類型,而小寫字母開頭是私有類型,真正做到了語言規範的最高境界之“望文知義”。而在C++開發代碼里沒有這樣的規定,因此看到一個類的成員變數名稱,還需要跳轉到類的定義才能確定它的訪問級別。Go語言強制規定了語法規範(不符合規範的代碼無法編譯通過),在工程中非常實用。 

2、介面設計。Go語言的核心是組合而不是繼承,Go語言支持面向對象,但是不支持繼承。因此在用Go語言設計程式時不需要考慮基類的設計,它的介面設計更為靈活,只需要專註每個類應該實現的功能。而C++語言支持繼承,很多面試官都喜歡問為什麼基類的析構函數一定要是virtual的?public繼承和private繼承的區別是什麼?在Go語言里,這些都統統不復存在。 

3、開發工具。Go語言作為Google的親兒子,它提供了編譯、測試、調試、性能分析等一系列標準工具,它的編譯效率極高,原生支持單元測試,支持調試和代碼檢查、性能分析等等,是一個名副其實的工程化開發語言;在C++中需要藉助各種各樣的開源工具來組合達到這個目標,其中用於C++程式性能分析的工具gperftools就是Google開源的。 

4、支持併發。Go語言被設計為支持併發,可以通過go關鍵字創建N個goroutine(一種用戶態線程)來實現併發,同時提供多個goroutine的同步機制,例如當N個goroutine都執行完畢才繼續執行。而C++需要藉助第三方框架來實現併發功能,例如線程池+非同步調用(一般由第三方RPC框架提供)。Go語言提供語言層面的併發支持,可以輕鬆的開發出併發框架。 

5、記憶體管理。Go語言和Java、python、lua一樣,都不需要程式員管理記憶體。而有經驗的C++程式員看到別人代碼里的new就害怕,因為不知道有沒有相應的delete,還有就是在哪裡delete的,會不會執行不到等等,總之是為記憶體管理這樣無趣又痛苦的事情耗費精力,雖然有auto_ptr、shared_ptr這樣的資源管理神器,但是語言本身是沒有禁止原生的new/delete的,擔心記憶體泄漏是一件很不爽的事情。 

6、defer語句。Go語言提供defer語句來保證釋放資源,例如在某個函數中打開一個文件後,通過defer filer.Close()來保證關閉文件操作一定會在函數結束時執行,而在C++中想做到這一點需要一些技巧,例如運用goto跳轉,或者封裝一個文件資源管理器。這點可以看出Go語言設計的多麼貼心。 

7、語法簡潔。Go的關鍵字更少,同時砍掉了很多不必要的功能,例如構造函數、析構函數(Go語言為每個對象賦予初始值,負責自動記憶體回收)。Go語言不需要每一行代碼都以分號結尾,python和lua也是這樣。 

8、函數支持多返回值。Go語言的函數支持返回多個值,例如返回計算結果數據和錯誤值,python和lua也都都支持這一特點,而在C++只支持單返回值,需要增加函數參數來達到同樣的目的,所以有時候C++函數有很多參數的原因,是因為有的參數被設計為出參。 

9、內置標準庫。Go語言提供了http、json、xml、正則表達式等很多後端系統開發中常用的庫,而C++需要使用很多第三方的庫,其缺點是在技術選型上花費一些時間和精力,或者花費更多精力自己造輪子。 

10、運行效率。Go語言作為一個編譯型語言,它的運行效率是很高的,遠遠高出解釋型的語言,不過當然沒有高質量的C++代碼程式運行效率高。問題是寫出高質量C++代碼需要付出相當大的努力,這對於很多有經驗的C++程式員來說都是一件十分困難的事。 

總結:Go語言是一門工程化、現代化的開發語言,吸取了C、C++、Java、python、lua等眾多語言的優點和長處,它為程式開發者考慮了很多,同時做了很多貼心的設計,目前非常成功和流行;C++語言語言的優勢仍然在於它的運行效率,但是在開發體驗和開發效率上已經落後其他語言,C++11、C++14、C++17等標準的推進也是為了讓C++語言能夠變的更好,適應新的開發潮流,但是它畢竟背負著沉重的歷史包袱,想要脫胎換骨是一件很偉大也很困難的事情。 

金句分享

思考時,要像一位智者;但講話時,要像一位普通人。

出自《人性的弱點》,作者是戴爾·卡耐基(Dale Carnegie),美國著名人際關係學大師。

解讀:思想要自由,講話要謙虛。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果第二次看到我的文章,歡迎右側掃碼訂閱我喲~ 👉 本文長度為3633字,建議閱讀10分鐘。 堅持原創,每一篇都是用心之作~ 如果我們的開發工作真的就如搭積木一般就好了,輪廓分明,個個分開,壞了哪塊積木換掉哪塊就好了。 但是,實際我們的工作中所面臨的可能只有一塊積木,而且還是一大塊,要換得一起換, ...
  • 在大數據盛行的現在,大屏數據可視化也已經成為了一個熱門的話題。大屏可視化可以運用在眾多領域中,比如工業互聯網、醫療、交通、工業控制等等。將各項重要指標數據以圖表、各種圖形等形式表現在一個頁面上,各種數據一目瞭然。隨著瀏覽器不斷發展完善,使用 Web 做大屏展示也已經不是新鮮的事了。市面上已有不少的大... ...
  • LieBrother公眾號原文: "行為型模式:模板方法" 十一大行為型模式之一:模板方法。 簡介 姓名 :模板方法 英文名 :Template Method Pattern 價值觀 :在我的掌控下,任由你發揮 個人介紹 : Define the skeleton of an algorithm i ...
  • 題意 "題目鏈接" Sol 線段樹合併板子題 cpp include using namespace std; const int MAXN = 400000, SS = MAXN 21; inline int read() { char c = getchar(); int x = 0, f = ...
  • 《c陷阱與缺陷》 編程者也許認為,程式一旦執行上述操作完畢,就可以自由地進行讀取和寫入的操作了。遺憾的是,事實總難遂人所願,為了保持與過去不能同時進行讀寫操作的程式的向下相容性,一個輸入操作不能隨後直接緊跟輸出操作,反之亦然。如果同時進行輸入和輸出操作,必須在其中插入fseek函數調用。 這個陷阱把 ...
  • 題意 "題目鏈接" Sol 說一個尾碼自動機+線段樹的無腦做法 首先建出SAM,然後對parent樹進行dp,維護最大次大值,最小次小值 顯然一個串能更新答案的區間是$[len_{fa_{x}} + 1, len_x]$,方案數就相當於是從$siz_x$裡面選兩個,也就是$\frac{siz_x ( ...
  • 註意:本 Spring Boot 系列文章基於 Spring Boot 版本 v2.1.1.RELEASE 進行學習分析,版本不同可能會有細微差別。 前言 關於配置文件可以配置的內容,在 "Spring Boot 官方網站" 已經提供了完整了配置示例和解釋。 可以這麼說,Spring Boot 的一 ...
  • import randomimport sysimport zipfileimport timefrom threading import Threadfrom multiprocessing import Processclass MyIterator: # letters = '01234567... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...