溫馨提示×

溫馨提示×

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

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

go是不是一種語言

發(fā)布時間:2022-12-27 13:56:58 來源:億速云 閱讀:129 作者:iii 欄目:編程語言

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

go是一種語言。Go(又稱Golang)是Google公司開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型、并具有垃圾回收功能的編程語言。Go是編譯型語言,使用編譯器來編譯代碼。編譯器將源代碼編譯成二進(jìn)制(或字節(jié)碼)格式;在編譯代碼時,編譯器檢查錯誤、優(yōu)化性能并輸出可在不同平臺上運行的二進(jìn)制文件。

go是一種語言。

Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型語言。Go 語言語法與 C 相近,但功能上有:內(nèi)存安全,GC(垃圾回收),結(jié)構(gòu)形態(tài)及 CSP-style 并發(fā)計算。

Go語言有時候被描述為“C 類似語言”,或者是“21 世紀(jì)的C語言”。Go 從C語言繼承了相似的表達(dá)式語法、控制流結(jié)構(gòu)、基礎(chǔ)數(shù)據(jù)類型、調(diào)用參數(shù)傳值、指針等很多思想,還有C語言一直所看中的編譯后機(jī)器碼的運行效率以及和現(xiàn)有操作系統(tǒng)的無縫適配。

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

Go 是編譯型語言

Go 使用編譯器來編譯代碼。編譯器將源代碼編譯成二進(jìn)制(或字節(jié)碼)格式;在編譯代碼時,編譯器檢查錯誤、優(yōu)化性能并輸出可在不同平臺上運行的二進(jìn)制文件。要創(chuàng)建并運行 Go 程序,程序員必須執(zhí)行如下步驟。

  • 使用文本編輯器創(chuàng)建 Go 程序;

  • 保存文件;

  • 編譯程序;

  • 運行編譯得到的可執(zhí)行文件。

這不同于 Python、Ruby 和 JavaScript 等語言,它們不包含編譯步驟。Go 自帶了編譯器,因此無須單獨安裝編譯器。

為什么要學(xué)習(xí)Go語言

如果你要創(chuàng)建系統(tǒng)程序,或者基于網(wǎng)絡(luò)的程序,Go語言是很不錯的選擇。作為一種相對較新的語言,它是由經(jīng)驗豐富且受人尊敬的計算機(jī)科學(xué)家設(shè)計的,旨在應(yīng)對創(chuàng)建大型并發(fā)網(wǎng)絡(luò)程序面臨的挑戰(zhàn)。

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

Go語言支持交叉編譯,比如說你可以在運行 Linux 系統(tǒng)的計算機(jī)上開發(fā)可以在 Windows 上運行的應(yīng)用程序。這是第一門完全支持 UTF-8 的編程語言,這不僅體現(xiàn)在它可以處理使用 UTF-8 編碼的字符串,就連它的源碼文件格式都是使用的 UTF-8 編碼。Go語言做到了真正的國際化!

Go語言的特性

  • 語法簡單

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

Go語言的語法處于簡單和復(fù)雜的兩極。C語言簡單到你每寫下一行代碼,都能在腦中想象出編譯后的模樣,指令如何執(zhí)行,內(nèi)存如何分配,等等。而 C 的復(fù)雜在于,它有太多隱晦而不著邊際的規(guī)則,著實讓人頭疼。相比較而言,Go 從零開始,沒有歷史包袱,在汲取眾多經(jīng)驗教訓(xùn)后,可從頭規(guī)劃一個規(guī)則嚴(yán)謹(jǐn)、條理簡單的世界。

Go語言的語法規(guī)則嚴(yán)謹(jǐn),沒有歧義,更沒什么黑魔法變異用法。任何人寫出的代碼都基本一致,這使得Go語言簡單易學(xué)。放棄部分“靈活”和“自由”,換來更好的維護(hù)性,我覺得是值得的。

將“++”、“--”從運算符降級為語句,保留指針,但默認(rèn)阻止指針運算,帶來的好處是顯而易見的。還有,將切片和字典作為內(nèi)置類型,從運行時的層面進(jìn)行優(yōu)化,這也算是一種“簡單”。

  • 并發(fā)模型

時至今日,并發(fā)編程已成為程序員的基本技能,在各個技術(shù)社區(qū)都能看到諸多與之相關(guān)的討論主題。在這種情況下Go語言卻一反常態(tài)做了件極大膽的事,從根本上將一切都并發(fā)化,運行時用 Goroutine 運行所有的一切,包括 main.main 入口函數(shù)。

可以說,Goroutine 是 Go 最顯著的特征。它用類協(xié)程的方式來處理并發(fā)單元,卻又在運行時層面做了更深度的優(yōu)化處理。這使得語法上的并發(fā)編程變得極為容易,無須處理回調(diào),無須關(guān)注線程切換,僅一個關(guān)鍵字,簡單而自然。

搭配 channel,實現(xiàn) CSP 模型。將并發(fā)單元間的數(shù)據(jù)耦合拆解開來,各司其職,這對所有糾結(jié)于內(nèi)存共享、鎖粒度的開發(fā)人員都是一個可期盼的解脫。若說有所不足,那就是應(yīng)該有個更大的計劃,將通信從進(jìn)程內(nèi)拓展到進(jìn)程外,實現(xiàn)真正意義上的分布式。

  • 內(nèi)存分配

將一切并發(fā)化固然是好,但帶來的問題同樣很多。如何實現(xiàn)高并發(fā)下的內(nèi)存分配和管理就是個難題。好在 Go 選擇了 tcmalloc,它本就是為并發(fā)而設(shè)計的高性能內(nèi)存分配組件。

可以說,內(nèi)存分配器是運行時三大組件里變化最少的部分。刨去因配合垃圾回收器而修改的內(nèi)容,內(nèi)存分配器完整保留了 tcmalloc 的原始架構(gòu)。使用 cache 為當(dāng)前執(zhí)行線程提供無鎖分配,多個 central 在不同線程間平衡內(nèi)存單元復(fù)用。在更高層次里,heap 則管理著大塊內(nèi)存,用以切分成不同等級的復(fù)用內(nèi)存塊??焖俜峙浜投墐?nèi)存平衡機(jī)制,讓內(nèi)存分配器能優(yōu)秀地完成高壓力下的內(nèi)存管理任務(wù)。

在最近幾個版本中,編譯器優(yōu)化卓有成效。它會竭力將對象分配在棧上,以降低垃圾回收壓力,減少管理消耗,提升執(zhí)行性能。可以說,除偶爾因性能問題而被迫采用對象池和自主內(nèi)存管理外,我們基本無須參與內(nèi)存管理操作。

  • 垃圾回收

垃圾回收一直是個難題。早年間,Java 就因垃圾回收低效被嘲笑了許久,后來 Sun 連續(xù)收納了好多人和技術(shù)才發(fā)展到今天。可即便如此,在 Hadoop 等大內(nèi)存應(yīng)用場景下,垃圾回收依舊捉襟見肘、步履維艱。

相比 Java,Go 面臨的困難要更多。因指針的存在,所以回收內(nèi)存不能做收縮處理。幸好,指針運算被阻止,否則要做到精確回收都難。

每次升級,垃圾回收器必然是核心組件里修改最多的部分。從并發(fā)清理,到降低 STW 時間,直到 Go 的 1.5 版本實現(xiàn)并發(fā)標(biāo)記,逐步引入三色標(biāo)記和寫屏障等等,都是為了能讓垃圾回收在不影響用戶邏輯的情況下更好地工作。盡管有了努力,當(dāng)前版本的垃圾回收算法也只能說堪用,離好用尚有不少距離。

  • 靜態(tài)鏈接

Go 剛發(fā)布時,靜態(tài)鏈接被當(dāng)作優(yōu)點宣傳。只須編譯后的一個可執(zhí)行文件,無須附加任何東西就能部署。這似乎很不錯,只是后來風(fēng)氣變了。連著幾個版本,編譯器都在完善動態(tài)庫 buildmode 功能,場面一時變得有些尷尬。

暫不說未完工的 buildmode 模式,靜態(tài)編譯的好處顯而易見。將運行時、依賴庫直接打包到可執(zhí)行文件內(nèi)部,簡化了部署和發(fā)布操作,無須事先安裝運行環(huán)境和下載諸多第三方庫。這種簡單方式對于編寫系統(tǒng)軟件有著極大好處,因為庫依賴一直都是個麻煩。

  • 標(biāo)準(zhǔn)庫

功能完善、質(zhì)量可靠的標(biāo)準(zhǔn)庫為編程語言提供了充足動力。在不借助第三方擴(kuò)展的情況下,就可完成大部分基礎(chǔ)功能開發(fā),這大大降低了學(xué)習(xí)和使用成本。最關(guān)鍵的是,標(biāo)準(zhǔn)庫有升級和修復(fù)保障,還能從運行時獲得深層次優(yōu)化的便利,這是第三方庫所不具備的。

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

當(dāng)然,優(yōu)秀第三方資源也是語言生態(tài)圈的重要組成部分。近年來崛起的幾門語言中,Go 算是獨樹一幟,大批優(yōu)秀作品頻繁涌現(xiàn),這也給我們學(xué)習(xí) Go 提供了很好的參照。

  • 工具鏈

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

內(nèi)置完整測試框架,其中包括單元測試、性能測試、代碼覆蓋率、數(shù)據(jù)競爭,以及用來調(diào)優(yōu)的 pprof,這些都是保障代碼能正確而穩(wěn)定運行的必備利器。

除此之外,還可通過環(huán)境變量輸出運行時監(jiān)控信息,尤其是垃圾回收和并發(fā)調(diào)度跟蹤,可進(jìn)一步幫助我們改進(jìn)算法,獲得更佳的運行期表現(xiàn)。

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

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

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

go
AI