Go 是 Google 於 2009 年釋出的靜態強型別語言,編譯速度快、垃圾回收輕量、內建並發原語。定位是系統程式設計與後端服務,不是「靜態語言的安全性加上動態語言的高效性」——它本質上就是靜態語言,只是刻意把複雜度壓低。

先備知識

Go 不適合作為第一門語言。建議先有任何一門語言的基礎,理解變數、迴圈、函式的概念。若尚未有程式基礎,先補 Python 或 JavaScript。

安裝環境

前往 go.dev/dl 下載對應平台的安裝包。安裝完成後執行:

1
go version

確認輸出版本號即安裝成功。

關於 GOPATH 與 Go Modules:Go 1.11 引入 Modules,1.16 起預設啟用。現代專案用 go mod init 初始化模組,原始碼放在任何目錄都行,不再需要把程式碼塞進 $GOPATH/src$GOPATH 仍然存在,但現在只作為模組快取($GOPATH/pkg/mod)和已安裝工具($GOPATH/bin)的存放位置,不需手動設定。

新建一個最小模組:

1
2
mkdir myapp && cd myapp
go mod init github.com/yourname/myapp

語言基礎

這是學習重心,建議按以下順序推進,每一塊都要動手寫程式碼,不能只讀。

語法與型別:Go 的型別推斷(:=)讓宣告很簡潔,但要清楚什麼時候用 var、什麼時候用 :=。基本型別包括 intfloat64stringbool,以及固定長度的陣列(array)。

切片(slice):Go 最常用的資料結構,底層是陣列的動態視窗。要理解 lencapappend 的行為,以及切片共享底層陣列可能帶來的副作用。

Map:鍵值對結構,讀取不存在的 key 會回傳零值而不是報錯,建議養成用 val, ok := m[key] 的二值寫法。

函式:Go 函式可以回傳多個值,這是處理錯誤的基礎。匿名函式、閉包、可變參數(...T)、defer 的執行順序(LIFO)都需要熟悉。

結構體與方法:Go 沒有 class,用結構體加方法替代。建構函式慣例是 NewXxx() 回傳指標。理解值接收者和指標接收者的差異。

介面(interface):Go 的介面是隱式實作,不需要 implements 宣告。空介面 interface{} 在 Go 1.18 後可以寫成 any。介面是 Go 實現多型與測試替換的核心機制,要花時間弄懂。

並發:goroutine 是 Go 的輕量執行緒,go func() 就能啟動。channel 是 goroutine 之間通訊的管道,分有緩衝和無緩衝。select 用於同時等待多個 channel。sync 套件的 WaitGroupMutex 處理同步與互斥。並發是 Go 的強項,也是最容易出 race condition 的地方,記得用 go test -race 檢查。

標準庫入門fmtosiobufionet/http 是最常用的幾個,先把這些讀熟。

推薦書籍:Donovan & Kernighan 合著的《The Go Programming Language》(gopl.io,中文版稱《Go語言聖經》)是最紮實的入門書,語言本質講得清楚。Mark Summerfield 的《Programming in Go》(2012年)實務導向,但出版時 Go Modules 尚未存在,書中的 GOPATH 工作流已不適用現代開發,參考時要留意。

Go Web 開發

標準庫 HTTP

Go 的 net/http 套件本身功能完整,不一定需要框架。理解 http.Handlerhttp.HandlerFuncServeMux 的運作方式,對之後使用任何框架都有幫助。

常用 Web 框架

  • Gin:路由效能高,中介層(middleware)生態成熟,是目前最普遍的選擇。
  • Echo:API 設計簡潔,效能與 Gin 相近。
  • Beego:全棧框架,內建 ORM 和 CLI 工具,適合快速搭建完整 MVC 應用,但相對重。

資料庫

標準庫 database/sql 提供統一介面,搭配各資料庫的 driver 使用。GORM 是最常用的 ORM,sqlx 則是輕量封裝,保留 SQL 控制彈性。

中介層常見用途

日誌記錄、身份驗證(JWT)、請求限流、CORS 處理,通常以 middleware chain 的方式掛載。

定時與非同步任務

標準庫的 time.Tickertime.AfterFunc 處理簡單定時邏輯;需要持久化的延遲任務佇列,Go 標準庫沒有內建,要搭配外部套件如 asynqmachinery

微服務

gRPC 是 Go 微服務間常用的通訊協定,搭配 Protocol Buffers 定義介面。

框架選擇:

  • go-zeroKratos:目前活躍度高、社群資源豐富,是新專案的主流選擇。
  • go-kit:提供微服務常用的 transport/endpoint/service 分層抽象,設計嚴謹,但新功能開發已趨緩,維護為主。
  • go-micro:授權已從 Apache-2.0 改為 BSL(Business Source License),商業使用有限制,使用前需確認授權條款,或改用社群維護的 fork。

Web 開發入門,官方的 Go by Example 程式碼片段導向,適合查語法;官方文件 go.dev/doc 的 Tour 也值得過一遍。

專案實戰

語法看完之後,最好找一個真實問題動手做。常見起手方向:命令列工具(cobra 是主流 CLI 框架)、REST API 服務、或為現有開源專案貢獻 issue fix。選自己有興趣的領域,能維持動力繼續寫下去。

持續追蹤

Go 每年約發布兩個版本。官方部落格 go.dev/blog 是最直接的消息來源,每次版本發布都會有 release notes 說明新特性與破壞性變更。