這是 Go 語言從零到 Web 應用系列的第一篇。整個系列共 10 篇文章,將帶你從完全不懂 Go,到能獨立建構一個具備 CRUD、認證、資料庫的完整 Web 應用程式。
Go 是什麼?
Go(又稱 Golang)是 Google 於 2009 年正式推出的開源程式語言,由 Robert Griesemer、Rob Pike 和 Ken Thompson 三位電腦科學大師共同設計。其中 Ken Thompson 是 Unix 和 C 語言的共同發明者,Rob Pike 則是 UTF-8 編碼的共同發明者。
Go 的誕生並非出於學術目的,而是為了解決 Google 內部面臨的真實工程問題:
- 編譯太慢:大型 C++ 專案的編譯時間動輒數十分鐘甚至數小時
- 依賴管理混亂:複雜的依賴關係讓專案難以維護
- 併發程式太難寫:傳統的 thread + lock 模型容易出錯
- 語言太複雜:C++ 和 Java 的功能越加越多,學習曲線越來越陡
Go 的設計目標很明確:在保持簡單的前提下,解決大規模軟體工程的問題。
Go 的設計哲學
Go 的核心哲學可以用三個字總結:少即是多。
簡潔至上
Go 刻意省略了許多其他語言中「理所當然」的功能:
- 沒有繼承:用組合(Composition)取代
- 沒有泛型(Go 1.18 前):直到社群有足夠共識才加入
- 沒有例外處理:用明確的錯誤回傳值取代 try/catch
- 沒有 Operator Overloading
- 沒有隱式型別轉換
這些看似「缺少」的功能,其實是刻意的設計選擇。Go 團隊認為,語言的價值不在於能做多少事,而在於讓開發者能多快理解和維護程式碼。
一種寫法
Go 提供了 gofmt 工具,統一所有程式碼的格式。沒有 tab vs space 的爭論,沒有大括號放哪行的討論。每個 Go 專案看起來都一樣,這大幅降低了閱讀他人程式碼的認知負擔。
快速編譯
Go 的編譯器設計從一開始就以速度為核心。即使是大型專案,通常也能在幾秒鐘內完成編譯。這讓「修改 → 編譯 → 測試」的開發循環非常流暢。
內建併發
Go 從語言層級就支持併發,透過 Goroutine 和 Channel 機制,讓開發者能用簡單直觀的方式撰寫高併發程式。
Go 適合用在哪裡?
最佳適用場景
1. 後端 API 服務
Go 的高效能和低記憶體佔用,讓它成為建構 REST API 和 gRPC 服務的絕佳選擇。標準庫自帶的 net/http 就足以建構生產級的 HTTP 服務。
2. 雲端基礎設施與 DevOps 工具
Docker、Kubernetes、Terraform、Prometheus — 現代雲端生態系的核心工具幾乎都是用 Go 寫的。Go 編譯成單一靜態二進位檔的特性,非常適合容器化部署。
3. CLI 工具
Go 編譯快、執行快、沒有 runtime 依賴,是建構命令列工具的理想語言。GitHub CLI(gh)、Hugo(本部落格使用的靜態網站生成器)都是 Go 的作品。
4. 微服務
Go 的輕量級 Goroutine(一個 Goroutine 只需約 2KB 記憶體,而一個 OS thread 通常需要 1MB+)讓它能輕鬆處理大量並發連線。
不太適合的場景
- GUI 桌面應用:Go 的 GUI 生態系相對薄弱
- 機器學習:Python 的 ML 生態系遠比 Go 成熟
- 前端開發:雖然有 WebAssembly 支持,但 JavaScript/TypeScript 仍是主流
- 嵌入式系統:C/C++ 和 Rust 更適合資源極度受限的環境
與其他語言的比較
Go vs Python
| 面向 | Go | Python |
|---|---|---|
| 執行速度 | 編譯語言,非常快 | 直譯語言,相對慢 |
| 型別系統 | 靜態型別 | 動態型別 |
| 併發模型 | Goroutine(原生支持) | GIL 限制,需用 multiprocessing |
| 學習曲線 | 中等 | 低 |
| 套件生態 | 中等規模,品質高 | 龐大且多元 |
| 部署 | 單一二進位檔 | 需要 runtime 和依賴 |
結論:Go 適合效能要求高的後端服務,Python 適合快速原型和資料科學。
Go vs Java
| 面向 | Go | Java |
|---|---|---|
| 啟動速度 | 極快(毫秒級) | 較慢(JVM 啟動需時間) |
| 記憶體佔用 | 低 | 較高(JVM overhead) |
| 語言複雜度 | 簡潔,25 個關鍵字 | 複雜,50+ 個關鍵字 |
| 生態系統 | 成長中 | 非常成熟 |
| 企業採用 | 中高 | 非常高 |
| 泛型支持 | Go 1.18+ 基本支持 | 成熟的泛型系統 |
結論:Go 更輕量和現代,Java 生態更成熟、企業支援更廣泛。
Go vs Rust
| 面向 | Go | Rust |
|---|---|---|
| 記憶體管理 | 垃圾回收(GC) | 所有權系統(無 GC) |
| 學習曲線 | 中等 | 陡峭 |
| 編譯速度 | 快 | 慢 |
| 執行效能 | 快 | 非常快(接近 C) |
| 安全性 | 型別安全 | 記憶體安全 + 型別安全 |
結論:需要極致效能和記憶體安全選 Rust,需要開發速度和團隊生產力選 Go。
業界應用案例
Go 的「老家」。Google 內部大量服務使用 Go 開發,包含 YouTube 和 Google Cloud 的基礎設施。
Uber
Uber 使用 Go 建構了他們的即時配對系統和地理空間服務。Go 的高併發特性讓它能處理每秒數百萬的定位更新請求。
Twitch
Twitch 的聊天系統使用 Go 重寫後,單一伺服器能處理超過 50 萬個同時連線,延遲大幅降低。
Docker & Kubernetes
整個現代容器生態系幾乎是 Go 的天下。Docker 和 Kubernetes 都是用 Go 開發的,這也反過來推動了 Go 在 DevOps 領域的普及。
Cloudflare
Cloudflare 使用 Go 處理他們的 DNS 服務和邊緣計算平台,每秒處理數百萬的 DNS 查詢。
學習 Go 的好理由
- 就業市場需求高:Go 開發者的薪資在各語言中名列前茅,且持續成長
- 學習曲線平緩:語言簡潔,有經驗的程式設計師通常幾天就能上手
- 工具鏈完善:內建格式化、測試、效能分析工具
- 跨平台編譯:一行指令就能編譯出不同作業系統的執行檔
- 社群活躍:持續成長的社群和豐富的學習資源
系列文章預覽
本系列共 10 篇文章,分為兩大部分:
基礎篇(第 1-5 篇)
- 為什麼要學 Go(本篇)
- 環境設定與 Hello World
- 基礎語法
- 資料結構
- 錯誤處理與併發
實戰篇(第 6-10 篇) 6. HTTP 基礎與第一個 Web Server 7. 專案結構與路由 8. 資料庫整合 9. 使用者認證 10. 測試與部署
每篇文章都可以獨立閱讀,但建議按順序跟著做,因為後面的文章會用到前面的知識。
下一步
在下一篇文章中,我們將動手安裝 Go 開發環境,設定編輯器,並寫出你的第一支 Go 程式。
準備好了嗎?讓我們開始吧!