Go 語言介紹
Go 語言歷史與設計哲學
Go(也稱為 Golang)是由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 設計的靜態類型編譯型程式語言。它創建於 2007 年,並於 2009 年正式發布。Go 的設計目的是解決現代軟體開發中的挑戰,特別是在大規模分散式系統和雲端運算環境中。
Go 的設計哲學強調:
- 簡潔性:乾淨、可讀的語法,關鍵字最少
- 並發性:內建對並發程式設計的支援,透過 goroutines 和 channels
- 效能:快速編譯和高效執行
- 安全性:強類型系統和記憶體安全,無需垃圾回收開銷
- 生產力:快速開發週期,內建工具和測試
與 JavaScript 的概覽對比
特性 | JavaScript | Go |
---|---|---|
程式設計範式 | 多範式(函數式、物件導向、事件驅動) | 多範式(程序式、並發、物件導向) |
類型系統 | 動態類型,弱類型 | 靜態類型,強類型 |
執行方式 | 解釋執行(瀏覽器/Node.js 中 JIT 編譯) | 編譯執行 |
記憶體管理 | 自動(垃圾回收) | 自動(垃圾回收) |
並發處理 | 事件驅動,async/await,Promises | 內建 goroutines 和 channels |
效能 | 相對較慢(解釋執行/GC) | 快速(編譯執行,高效 GC) |
應用場景 | Web 開發、行動應用、桌面應用 | 系統程式設計、微服務、雲原生、Web 服務 |
編譯型 vs 解釋型語言
JavaScript(解釋型/JIT 編譯): JavaScript 程式碼通常由解釋器執行(如瀏覽器的 JavaScript 引擎或 Node.js)。雖然現代 JavaScript 引擎使用即時(JIT)編譯在執行時將程式碼轉換為機器碼以提高效能,但其核心特徵是程式碼不會預先編譯成獨立的可執行檔案。
Go(編譯型): Go 程式碼必須在執行前編譯成機器碼。這個過程包括:
- 解析:Go 編譯器將原始碼解析為抽象語法樹(AST)
- 類型檢查:靜態類型分析和語義驗證
- 編譯:將 Go 程式碼轉換為機器碼
- 連結:將編譯後的程式碼和依賴項組合成單個可執行檔案
Go 的編譯速度極快,即使對於大型專案也只需要幾秒鐘,這使得它在開發速度方面感覺更像解釋型語言。
Go 應用場景和優勢
應用場景:
- 微服務:高效能、可擴展的微服務架構
- 雲原生開發:Kubernetes、Docker 和雲端平台開發
- Web 服務:RESTful API、GraphQL 服務和 Web 應用
- 系統程式設計:網路服務、系統工具和實用程式
- DevOps 工具:CI/CD 流水線、監控工具和自動化腳本
- 高效能運算:並發資料處理和即時系統
優勢:
- 並發性:內建 goroutines 和 channels,便於並發程式設計
- 效能:快速編譯和高效執行
- 簡潔性:乾淨的語法和最小的學習曲線
- 標準庫:豐富的標準庫,包含網路、HTTP 和測試功能
- 跨平台:單一二進制檔案部署到不同平台
- 工具鏈:優秀的內建工具(go fmt、go test、go mod 等)
- 雲原生:專為現代雲端和容器環境設計
開發環境設定
要編寫和執行 Go 程式碼,你需要:
- Go 安裝:從官方網站下載並安裝 Go
- 文字編輯器或 IDE:Visual Studio Code、GoLand、Vim 或任何支援 Go 的文字編輯器
- Go 模組:現代依賴管理(Go 1.11+)
安裝說明:
# 從 https://golang.org/dl/ 下載 Go# macOS(使用 Homebrew)brew install go# Ubuntu/Debiansudo apt updatesudo apt install golang-go# Windows# 從 golang.org/dl/ 下載 MSI 安裝程式
驗證安裝:
go version# 應該輸出:go version go1.21.x darwin/amd64(或類似)
設定 Go 工作空間:
# 為你的 Go 專案建立目錄mkdir ~/gocd ~/go# 初始化新模組go mod init myproject
你的第一個 Go 程式
讓我們編寫一個簡單的 "Hello, World!" Go 程式。
正在加载...
編譯和執行過程
要編譯和執行 Go "Hello, World!" 程式(假設你將其儲存為 hello.go
):
-
直接執行(開發推薦):
go run hello.go這一步編譯並執行程式,非常適合開發。
-
建置可執行檔案:
go build hello.go這會建立一個名為
hello
的可執行檔案(Windows 上為hello.exe
)。 -
執行可執行檔案:
./hello # Unix 類系統hello.exe # Windows
Go 模組系統
Go 使用模組進行依賴管理。以下是設定新專案的方法:
# 為你的專案建立新目錄mkdir my-go-projectcd my-go-project# 初始化新模組go mod init my-go-project# 這會建立一個追蹤依賴項的 go.mod 檔案
go.mod 檔案範例:
module my-go-projectgo 1.21require (github.com/gin-gonic/gin v1.9.1github.com/go-sql-driver/mysql v1.7.1)
Go 工具鏈
Go 提供了優秀的內建工具:
go run
:編譯並執行 Go 程式go build
:將 Go 程式編譯為可執行檔案go test
:執行測試go fmt
:格式化 Go 程式碼go mod
:管理依賴項go get
:下載並安裝包go vet
:分析程式碼中的潛在問題go doc
:產生文件
JavaScript 開發者需要了解的關鍵 Go 概念
1. 包和匯入:
package main // 宣告包import ("fmt" // 標準庫包"strings" // 另一個標準庫包)
2. 函數:
func add(a, b int) int {return a + b}
3. 變數和類型:
var name string = "Go"age := 25 // 短變數宣告(類型推斷)
4. 並發(Go 的超能力):
go func() {// 這會並發執行fmt.Println("在 goroutine 中執行")}()
練習題:
- Go 和 JavaScript 在執行模型方面的主要區別是什麼?
- 列出 Go 比 JavaScript 更優選的三個常見應用領域,並解釋原因。
- 描述設定 Go 開發環境涉及的步驟。
go run
和go build
之間有什麼區別?
專案想法:
- 在 Go 中建立一個簡單的 HTTP 伺服器,提供 "Hello, World!" 訊息,並與 Node.js 等效版本進行比較。
下一步:
- 學習 Go 的語法以及它與 JavaScript 的比較
- 理解 Go 的類型系統和介面
- 探索 Go 強大的並發特性:goroutines 和 channels