golang是中國的嗎

2023-01-03 18:01:40

golang不是中國的。golang是Google開發的一種靜態強型別、編譯型、並行型,並具有垃圾回收功能的程式語言。golang是程式語言設計的又一次嘗試,是對類C語言的重大改進,它不但能讓你存取底層作業系統,還提供了強大的網路程式設計和並行程式設計支援。Go語言的用途眾多,可以進行網路程式設計、系統程式設計、並行程式設計、分散式程式設計。

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

golang不是中國的。

Golang(又稱 Go或Go語言)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種靜態強型別、編譯型、並行型,並具有垃圾回收功能的程式語言。

Go語言(或 Golang)起源於 2007 年,並在 2009 年正式對外發布。Go 是非常年輕的一門語言,它的主要目標是「兼具 Python 等動態語言的開發速度和 C/C++ 等編譯型語言的效能與安全性」。

Go語言是程式語言設計的又一次嘗試,是對類C語言的重大改進,它不但能讓你存取底層作業系統,還提供了強大的網路程式設計和並行程式設計支援。Go語言的用途眾多,可以進行網路程式設計、系統程式設計、並行程式設計、分散式程式設計。

Go語言的推出,旨在不損失應用程式效能的情況下降低程式碼的複雜性,具有「部署簡單、並行性好、語言設計良好、執行效能好」等優勢,目前國內諸多 IT 公司均已採用Go語言開發專案。

Go語言有時候被描述為「C 類似語言」,或者是「21 世紀的C語言」。Go 從C語言繼承了相似的表示式語法、控制流結構、基礎資料型別、呼叫引數傳值、指標等很多思想,還有C語言一直所看中的編譯後機器碼的執行效率以及和現有作業系統的無縫適配。

因為Go語言沒有類和繼承的概念,所以它和 Java 或 C++ 看起來並不相同。但是它通過介面(interface)的概念來實現多型性。Go語言有一個清晰易懂的輕量級型別系統,在型別之間也沒有層級之說。因此可以說Go語言是一門混合型的語言。

此外,很多重要的開源專案都是使用Go語言開發的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。

為什麼要學習Go語言

如果你要建立系統程式,或者基於網路的程式,Go語言是很不錯的選擇。作為一種相對較新的語言,它是由經驗豐富且受人尊敬的電腦科學家設計的,旨在應對建立大型並行網路程式面臨的挑戰。

在Go語言出現之前,開發者們總是面臨非常艱難的抉擇,究竟是使用執行速度快但是編譯速度並不理想的語言(如:C++),還是使用編譯速度較快但執行效率不佳的語言(如:.NET、Java),或者說開發難度較低但執行速度一般的動態語言呢?顯然,Go語言在這 3 個條件之間做到了最佳的平衡:快速編譯,高效執行,易於開發。

Go語言支援交叉編譯,比如說你可以在執行 Linux 系統的計算機上開發可以在 Windows 上執行的應用程式。這是第一門完全支援 UTF-8 的程式語言,這不僅體現在它可以處理使用 UTF-8 編碼的字串,就連它的原始碼檔案格式都是使用的 UTF-8 編碼。Go語言做到了真正的國際化!

Go語言的特性

語法簡單

拋開語法樣式不談,單就型別和規則而言,Go 與 C99、C11 相似之處頗多,這也是Go語言被冠以「NextC」名號的重要原因。

Go語言的語法處於簡單和複雜的兩極。C語言簡單到你每寫下一行程式碼,都能在腦中想象出編譯後的模樣,指令如何執行,記憶體如何分配,等等。而 C 的複雜在於,它有太多隱晦而不著邊際的規則,著實讓人頭疼。相比較而言,Go 從零開始,沒有歷史包袱,在汲取眾多經驗教訓後,可從頭規劃一個規則嚴謹、條理簡單的世界。

Go語言的語法規則嚴謹,沒有歧義,更沒什麼黑魔法變異用法。任何人寫出的程式碼都基本一致,這使得Go語言簡單易學。放棄部分「靈活」和「自由」,換來更好的維護性,我覺得是值得的。

將「++」、「--」從運運算元降級為語句,保留指標,但預設阻止指標運算,帶來的好處是顯而易見的。還有,將切片和字典作為內建型別,從執行時的層面進行優化,這也算是一種「簡單」。

並行模型

時至今日,並行程式設計已成為程式設計師的基本技能,在各個技術社群都能看到諸多與之相關的討論主題。在這種情況下Go語言卻一反常態做了件極大膽的事,從根本上將一切都並行化,執行時用 Goroutine 執行所有的一切,包括 main.main 入口函數。

可以說,Goroutine 是 Go 最顯著的特徵。它用類協程的方式來處理並行單元,卻又在執行時層面做了更深度的優化處理。這使得語法上的並行程式設計變得極為容易,無須處理回撥,無須關注執行緒切換,僅一個關鍵字,簡單而自然。

搭配 channel,實現 CSP 模型。將並行單元間的資料耦合拆解開來,各司其職,這對所有糾結於記憶體共用、鎖粒度的開發人員都是一個可期盼的解脫。若說有所不足,那就是應該有個更大的計劃,將通訊從程序內拓展到程序外,實現真正意義上的分散式。

記憶體分配

將一切並行化固然是好,但帶來的問題同樣很多。如何實現高並行下的記憶體分配和管理就是個難題。好在 Go 選擇了 tcmalloc,它本就是為並行而設計的高效能記憶體分配元件。

可以說,記憶體分配器是執行時三大元件裡變化最少的部分。刨去因配合垃圾回收器而修改的內容,記憶體分配器完整保留了 tcmalloc 的原始架構。使用 cache 為當前執行執行緒提供無鎖分配,多個 central 在不同執行緒間平衡記憶體單元複用。在更高層次裡,heap 則管理著大塊記憶體,用以切分成不同等級的複用記憶體塊。快速分配和二級記憶體平衡機制,讓記憶體分配器能優秀地完成高壓力下的記憶體管理任務。

在最近幾個版本中,編譯器優化卓有成效。它會竭力將物件分配在棧上,以降低垃圾回收壓力,減少管理消耗,提升執行效能。可以說,除偶爾因效能問題而被迫採用物件池和自主記憶體管理外,我們基本無須參與記憶體管理操作。

垃圾回收

垃圾回收一直是個難題。早年間,Java 就因垃圾回收低效被嘲笑了許久,後來 Sun 連續收納了好多人和技術才發展到今天。可即便如此,在 Hadoop 等大記憶體應用場景下,垃圾回收依舊捉襟見肘、步履維艱。

相比 Java,Go 面臨的困難要更多。因指標的存在,所以回收記憶體不能做收縮處理。幸好,指標運算被阻止,否則要做到精確回收都難。

每次升級,垃圾回收器必然是核心元件裡修改最多的部分。從並行清理,到降低 STW 時間,直到 Go 的 1.5 版本實現並行標記,逐步引入三色標記和寫屏障等等,都是為了能讓垃圾回收在不影響使用者邏輯的情況下更好地工作。儘管有了努力,當前版本的垃圾回收演演算法也只能說堪用,離好用尚有不少距離。

靜態連結

Go 剛釋出時,靜態連結被當作優點宣傳。只須編譯後的一個可執行檔案,無須附加任何東西就能部署。這似乎很不錯,只是後來風氣變了。連著幾個版本,編譯器都在完善動態庫 buildmode 功能,場面一時變得有些尷尬。

暫不說未完工的 buildmode 模式,靜態編譯的好處顯而易見。將執行時、依賴庫直接打包到可執行檔案內部,簡化了部署和釋出操作,無須事先安裝執行環境和下載諸多第三方庫。這種簡單方式對於編寫系統軟體有著極大好處,因為庫依賴一直都是個麻煩。

標準庫

功能完善、品質可靠的標準庫為程式語言提供了充足動力。在不借助第三方擴充套件的情況下,就可完成大部分基礎功能開發,這大大降低了學習和使用成本。最關鍵的是,標準庫有升級和修復保障,還能從執行時獲得深層次優化的便利,這是第三方庫所不具備的。

Go 標準庫雖稱不得完全覆蓋,但也算極為豐富。其中值得稱道的是 net/http,僅須簡單幾條語句就能實現一個高效能 Web Server,這從來都是宣傳的亮點。更何況大批基於此的優秀第三方 Framework 更是將 Go 推到 Web/Microservice 開發標準之一的位置。

當然,優秀第三方資源也是語言生態圈的重要組成部分。近年來崛起的幾門語言中,Go 算是獨樹一幟,大批優秀作品頻繁湧現,這也給我們學習 Go 提供了很好的參照。

工具鏈

完整的工具鏈對於日常開發極為重要。Go 在此做得相當不錯,無論是編譯、格式化、錯誤檢查、幫助檔案,還是第三方包下載、更新都有對應的工具。其功能未必完善,但起碼算得上簡單易用。

內建完整測試框架,其中包括單元測試、效能測試、程式碼覆蓋率、資料競爭,以及用來調優的 pprof,這些都是保障程式碼能正確而穩定執行的必備利器。

除此之外,還可通過環境變數輸出執行時監控資訊,尤其是垃圾回收和並行排程跟蹤,可進一步幫助我們改進演演算法,獲得更佳的執行期表現。

【相關推薦:Go視訊教學、】

以上就是golang是中國的嗎的詳細內容,更多請關注TW511.COM其它相關文章!