跳至內容

Go

出自Taiwan Tongues 台語維基
於 2025年8月22日 (五) 13:32 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Go(閣稱Golang)是 Google 開發的一種靜態強型別、編譯型、並發型,而且有糞埽回收功能的程式語言。

羅伯特 ・ 格瑞史莫、羅榮 ・ 派克佮肯 ・ 湯普遴佇二空空七年九月開始設計 Go,較等咧伊恩 ・ 蘭斯 ・ 泰勒(Ian Lance Taylor)、 拉斯 ・ 考克斯(Russ Cox)加入專案。Go 是因為 Inferno 作業系統所開發的。Go 佇二空空九年十一月正式宣佈推出,成做開放原始碼專案,支援 Linux、macOS、Windows 等作業系統。

佇二空一六年,Go 予軟體評價公司 TIOBE 選為「TIOBE 二空一六年最佳語言」。

目前,Go 每半冬發佈一个二級版本(即從 a . x 升級到 a . y)。

是咧講

Go 的語法接近 C 語言,但對著變數的聲明有所無仝款。Go 支援糞埽回收功能。Go 的平行計算模型是以東尼 ・ 霍爾的交談循序程式(CSP)為基礎,採取類似模型的其他的語言套件括 Occam 和 Limbo,Go 嘛有這个模型的特徵呢,比如講通道傳輸。通過 goroutine 佮通道等閣列構造會當建造執行緒池佮管道等等的。佇一鋪八版本內底開放外掛程式(Plugin)的支援,無意味著會當對 Go 中動態載入部份函式。

佮 C + + 相比並,Go 並無包括如列舉、例外處理、繼承、泛型(這是功能佇咧 go 一孵一八中加入)、 斷言、虛擬函式等等的功能,猶毋過有增加切片 ( Slice ) 型、並行、管道、糞埽回收、介面等特性的語言級支援。對斷言的存在,是持負面態度,同時嘛為家己無提供型莫繼承來辯護。

無仝 Java,Go 原生提供關聯陣列(嘛是雜鬥表(Hashes)抑是字典(Dictionaries))。

批評

就算講 Go 的官方佮支持者對語言內底袂當用泛型佮異常處理有大量辯解說詞,毋過批評聲也毋捌停過。咧發表 Go 語言二四界空的草案的時陣,官方講無泛型、異常處理佮模組對於 Go 發展造成真大的阻礙,等同承認 Go 無遮的特色是設計錯誤。

Go 的糞埽回收機制一直予臭頭雞仔,一直到一石八版本糞埽回收的功能才有較穩定。毋過就算講遮爾,Go 的糞埽回收抑是遠遠落後 JVM 的 G 一和 ZGC。Discord 的研發團隊佇二空二空年初甚至發表一篇部落格,宣佈共其中一个服務由 Go 轉移到 Rust,理由是 Go 的糞埽回收會致使每二分鐘出現一擺卡頓,並且 Discord 研發團隊測試矣 Go 語言的一鈕八、一孵九、一孵一空版本這个問題攏無改善。

歷史

二空空七年,Google 設計的 Go,目的是提高在多核、網路機器(networked machines)、 大型代碼庫(codebases)的情況下開發效率。彼當陣佇咧 Google,設計師想欲解決其他的語言使用中的缺點,但是猶原保留𪜶的優點。

  • 靜態型別和執行的時效率。(如:C + +)
  • 通讀性佮易用性。(如:Python 和 JavaScript)
  • 高效能的網路佮多行程。

設計師主要受𪜶之間流傳的「毋通像 C + +」啟發。

Go 佇二空空九年十一月正式宣佈推出,版本一孵空佇二空一二年三月發佈。了後,Go 廣泛應用於 Google 的產品佮濟濟其他組織佮開源專案。

佇二空一六年十一月,Go(一个無襯線體)和 Go Mono 字型(一種等闊字型)分別由著設計師查爾斯 ・ 比格洛和克莉絲 ・ 荷姆斯發布。兩種字型攏採用矣 WGL 四,並且照著 DIN 一千四百五十標準,會用得足深的使用矣 large x-height 和 letterforms。

佇二空一八年八月,原生的圖示換起來。待描述完整但是,Gopher mascot 猶閣有仝款號的名。

佇二空一八年八月,Go 的主要貢獻者發佈了兩个關於語言新功能的「草稿設計—— 泛型佮例外處理,同齊尋求 Go 使用者的回饋。Go 因為在一 . x 時,欠缺對泛型編程的支援佮傷長的例外處理來備受批評。

版本歷史

Go 一保證語言規範佮標準庫的主要部份相容。到這陣的 Go 一孵二空發布 e,所有的版本攏履行矣這个承諾。 逐个主要的 Go 發佈版本會受著支援,到出現兩个新的主要版本為止。


代碼範例

Hello World

下跤是用 Go 寫成的 Hello World 程式:

HTTP 彼號網頁侍服器

透過 Go 干焦需要幾行程式碼就完成 HTTP 彼號網頁侍服器的實在:

Echo 命令程式

下跤的例說明了是按怎用 Go 去實現一个像 Unix 中的 Echo 命令程式:

語言特徵

編寫風格

Go 有定義如下的編寫風格:

一 . 每行程式了後無需要編寫分號 ` ; `。 二 . 大括號 ` { ` 袂使換行囥。 三 . ` if ` 判斷式佮 ` for ` 迴箍毋免以小括號包括起來。 四 . 使用 tab 做排版除了第二點外(換行會產生編譯錯誤), 佇無符合上述規定的時陣,猶閣會當編譯,但是使用著內建 gofmt 家私頭仔,會自動整理程式碼,予符合規定的編寫風格。

專案架構

module

Go 採用 module 的概念(佇咧 go 一爿一爿才開始啟用,舊版本請參閱工作區), 逐个案攏是一个 module,猶閣逐个 module 下底會有一个 ` go . mod ` 的檔案,來管理該 module 所參照的外部庫、開發版本…… 等咧。

一个 module 的資料篋仔 kha-tá-lok-guh 可能如下

` ` ` go . mod hello / hello . go outyet / main . go main _ test . go # 測試用的程式 stringutil / reverse . go reverse _ test . go # 測試用的程式 bmp / reader . go writer . go ` ` `

然後 go . mod 的內容可能為這个

` ` ` module example . org / go-mod-sample

go 一孵一一

require ( github . com / golang / example v 空吱吱 . 空九二十五空二千二百空四分一千二百二十一孵三千六百五十二 e 六桱八千七百七十三 dfca 零 golang . org / x / image v 空七一 . 零 ) ` ` `

工作區

Go 的工作區佇咧 ` GOPATH `,其實 kha-tá-lok-guh 結構如下:

` ` ` src pkg bin ` ` `

三个 kha-tá-lok-guh 的用途分別為舉例來講,規个案 kha-tá-lok-guh 可能會落去乎:

` ` ` bin / hello # 生成的執行檔 outyet # 生成的執行檔 pkg / linux _ amd 六十四 / github . com / golang / example / stringutil . a # 編譯的時,生成的對象檔案 src / github . com / golang / example / . git / # 外部 Git 庫的詮釋資料 hello / hello . go # Git 庫的程式碼 outyet / main . go # Git 庫的程式碼 main _ test . go # Git 庫的程式碼(測試用的程式) stringutil / reverse . go # Git 庫的程式碼 reverse _ test . go # Git 庫的程式碼(測試用的程式) golang . org / x / image / . git / # 外部 Git 庫的詮釋資料 bmp / reader . go # Git 庫的程式碼 writer . go # Git 庫的程式碼

` ` `

輕型協程

Go 的主要特色囥佇咧使用的併行設計,叫做 Goroutine,透過 Goroutine 會當予程式以異步的方式執行,就無需要煩惱一个函式致使程式斷去,所以 Go 嘛非常的適合網路服務。準講有一个程式,內底有兩个函式:

這个時陣透過 Go 予其中一个函式同步執行,按呢就無需要等待這改函式執行了後才會當執行後一个函式。

Goroutine 是類似執行緒的概念,屬於纖程 ( 區別於協程佮執行緒 )。執行緒屬於系統層面,通常來講建立一个新的執行緒會消磨較濟的資源閣管理無簡單;啊若協程的主要是欲作用是提供予一个執行緒內的併發性,煞袂當利用家己的處理器執行緒。而且 Goroutine 就親像輕量級的執行緒,一个 Go 程式會當執行超過數萬个 Goroutine,而且遮的效能攏是原生級的,隨時攏會當關起來、結束,而且運行佇濟个處理器執行緒上。一个核心內底會當有偌个 Goroutine,透過 GOMAXPROCS 參數你會當限制 Gorotuine 會當佔用幾个系統執行緒來避免失控。

佇內建的官方套佇內底嘛不時會當看著 Goroutine 的應用,像講 net / http 中用來監聽網路服務的函式實際上是建立一个不斷執行迴圈的 Goroutine;同時配合矣 epoll 等 IO 多路復用機制維護 Goroutine 的事件回轉。

編譯器

當前有兩个 Go 編譯器分支,分別為官方編譯器 gc 和 gccgo。官方編譯器佇初期的時陣是用 C 寫做,後用 Go 重寫對而實現自舉。Gccgo 𪜶是一種使用標準 GCC 成做後端的 Go 編譯器。

官方編譯器支援平台編譯(毋過無支援 CGO), 允准將原始碼編譯做會當佇目標系統、架構上執行的二進位檔案。

參考文獻

外部連結