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 語言能夠變的更好,適應新的開發潮流,但是它畢竟揹負着沉重的歷史包袱,想要脱胎換骨是一件很偉大也很困難的事情。