首頁 >後端開發 >Golang >go是一種語言嗎

go是一種語言嗎

青灯夜游
青灯夜游原創
2022-12-19 13:49:436735瀏覽

go是一種語言。 Go(又稱Golang)是Google公司開發的靜態強型別、編譯型、並髮型、並具備垃圾回收功能的程式語言。 Go是編譯型語言,使用編譯器來編譯程式碼。編譯器將原始程式碼編譯成二進位(或位元組碼)格式;在編譯程式碼時,編譯器會檢查錯誤、最佳化效能並輸出可在不同平台上執行的二進位檔案。

go是一種語言嗎

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

go是一種語言。

Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 所發展的靜態強型別、編譯型語言。 Go 語言文法與 C 相近,但功能上有:記憶體安全,GC(垃圾回收),結構形態及 CSP-style 並發計算。

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

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

Go 是編譯型語言

Go 使用編譯器來編譯程式碼。編譯器將原始程式碼編譯成二進位(或位元組碼)格式;在編譯程式碼時,編譯器會檢查錯誤、最佳化效能並輸出可在不同平台上執行的二進位檔案。要建立並執行 Go 程序,程式設計師必須執行以下步驟。

  • 使用文字編輯器建立Go 程式;

  • #儲存檔案;

  • 編譯程式;

  • 執行編譯得到的可執行檔。

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

為什麼要學習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是一種語言嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn