1. 什麼是圍棋?
Go(或 Golang)是一種開源程式語言,由 羅伯特·格里塞默, 羅布派克 和 肯湯普森 2007年在Google發布,2009年正式發布。 Go旨在解決大規模軟體開發的實際問題: 快速編譯, 簡單並行, 部署簡單。
Go 是一種語言 靜態型別, 編譯的,建立一個沒有運行時依賴性的唯一二進位。這就是為什麼 Go 是首選 雲端原生 — Docker、Kubernetes、Terraform、Prometheus 等都是用 Go 寫的。
突出特點
- 簡單易讀:只有25個關鍵字,極簡語法,易於閱讀程式碼
- 快速編譯:在幾秒鐘內編譯整個大型項目
- 內建並行:Goroutines 和 Channels 是一等公民
- 靜態二進位文件:單一二進位文件,可輕鬆交叉編譯任何作業系統/架構
- 垃圾收集:高效率 GC,低延遲(從 Go 1.19+ 開始為亞毫秒)
- 豐富的標準庫:HTTP 伺服器、JSON、加密、測試...內建
2. 為什麼選擇Go?
進入工業界
Go 被大公司廣泛使用:
| 公司簡介 | 使用 Go 的產品 |
|---|---|
| Kubernetes、gVisor、許多內部服務 | |
| 碼頭工人 | Docker 引擎、Docker 組合 |
| 橋公司 | Terraform、Consul、Vault、Nomad |
| 優步 | 微服務平台、Jaeger 追蹤 |
| 雲耀 | 邊緣運算、DNS、安全工具 |
| 抽搐 | 聊天服務(每秒處理數百萬條訊息) |
| Netflix | 基礎設施工具 |
| Dropbox | 從 Python 遷移到 Go 以提高效能 |
最合適的用例
- 微服務和 API:REST、gRPC、GraphQL 後端
- 雲端基礎設施:CLI 工具、操作員、控制器
- 開發營運工具:CI/CD、監控、自動化
- 網路:代理、負載平衡器、VPN
- 數據管道:ETL,流處理
- 區塊鏈:以太坊Go客戶端(Geth)
3. Go 與其他語言的比較
| 標準 | 去 | 鐵鏽 | 爪哇 | 蟒蛇 | Node.js |
|---|---|---|---|---|---|
| 打字 | 靜態 | 靜態 | 靜態 | 動態 | 動態 |
| 編譯 | 本機二進位文件 | 本機二進位文件 | JVM字節碼 | 解釋 | 即時生產(V8) |
| 氣相層析 | 是(低延遲) | 否(所有權) | 是(JVM GC) | 是的 | 是(V8 GC) |
| 並發性 | Goroutine | 非同步/等待+線程 | 虛擬線程 | 非同步 | 事件循環 |
| 學習曲線 | 低 | 高 | 平均 | 低 | 低 |
| 效能 | 高 | 非常高 | 高 | 低 | 平均 |
| 記憶體使用情況 | 低 | 很低 | 高 | 高 | 平均 |
| 部署規模 | 〜10-20MB | 〜5-15MB | JRE+JAR | 運行時 + 依賴項 | 運行時 + 節點模組 |
| 生態系統 | 好 | 發展中 | 很大 | 很大 | 很大 |
何時選擇 Go 而不是 Rust? 當你需要快速寫作、快速團隊入職、GC 可接受時,就去吧。當您需要零成本抽象、絕對記憶體安全、嵌入式/系統時,請使用 Rust。
何時選擇 Go 而不是 Java? 當您需要容器友善(緊湊、快速啟動)、不需要 JVM 生態系統時就可以使用。需要時使用 Java Spring 生態系統、企業標準、遺留整合。
4.Go的設計理念
Go 遵循非常特殊的設計原則:
4.1.簡單勝過聰明
// Go: explicit, simple
if err != nil {
return fmt.Errorf("failed to read file: %w", err)
}
// Không có: exceptions, try-catch, generics phức tạp
// Không có: inheritance, ternary operator
// Không có: optional chaining, null coalescing
4.2.組合優於繼承
// Go sử dụng embedding thay vì inheritance
type Animal struct {
Name string
}
func (a Animal) Speak() string {
return a.Name + " speaks"
}
type Dog struct {
Animal // embedding, không phải inheritance
Breed string
}
// Dog "kế thừa" method Speak() từ Animal
dog := Dog{Animal: Animal{Name: "Rex"}, Breed: "Labrador"}
fmt.Println(dog.Speak()) // "Rex speaks"
4.3.並發不是並行
羅布派克: “並發是指同時處理很多事情。並行性是指同時處理很多事情。”
// Goroutines: lightweight concurrent execution
go func() {
// Chạy concurrent, chi phí ~2KB stack
}()
// Channels: communication between goroutines
ch := make(chan string)
go func() { ch <- "hello" }()
msg := <-ch
4.4.一種格式化方法
戈夫姆特 根據獨特的標準自動格式化程式碼。不再爭論代碼風格。
5.安裝Go
5.1. macOS
# Cách 1: Homebrew (khuyến nghị)
brew install go
# Cách 2: Download từ go.dev
# Tải file .pkg từ https://go.dev/dl/ và cài đặt
# Verify
go version
# go version go1.23.x darwin/arm64
5.2. Linux(Ubuntu/Debian)
# Download và extract
wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz
# Thêm vào PATH (thêm vào ~/.bashrc hoặc ~/.zshrc)
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
# Verify
go version
5.3.窗戶
# Cách 1: Winget
winget install GoLang.Go
# Cách 2: Download .msi từ https://go.dev/dl/
# Verify (mở terminal mới)
go version
5.4. GOPATH 和 Go 工作區
# Xem cấu hình Go
go env
# Các biến quan trọng:
# GOROOT = /usr/local/go (Go installation)
# GOPATH = $HOME/go (Go workspace)
# GOBIN = $GOPATH/bin (Compiled binaries)
# GOMODCACHE = $GOPATH/pkg/mod (Module cache)
# Go workspace structure:
# ~/go/
# ├── bin/ ← Installed binaries (golangci-lint, air, etc.)
# ├── pkg/mod/ ← Downloaded module cache
# └── src/ ← (Legacy, không dùng với modules)
6.Hello World-第一個Go程序
6.1.初始化項目
# Tạo thư mục project
mkdir hello-go && cd hello-go
# Khởi tạo Go module
go mod init github.com/yourname/hello-go
# Tạo file go.mod - quản lý dependencies
6.2.編寫程式碼
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, Go! 🚀")
// Variables
name := "Gopher" // short declaration
age := 15 // Go ra đời 2009
fmt.Printf("Xin chào %s, Go đã %d tuổi!\n", name, age)
}
6.3.運行和構建
# Chạy trực tiếp (compile + run)
go run main.go
# Output: Hello, Go! 🚀
# Output: Xin chào Gopher, Go đã 15 tuổi!
# Build binary
go build -o hello-go main.go
./hello-go
# Cross-compile cho Linux (từ macOS)
GOOS=linux GOARCH=amd64 go build -o hello-go-linux main.go
# Cross-compile cho Windows
GOOS=windows GOARCH=amd64 go build -o hello-go.exe main.go
7.Go工具鏈
Go 附帶了一套強大的工具,無需額外安裝:
| 命令 | 目的 |
|---|---|
去跑步 | 直接編譯運行 |
去建造 | 編譯成二進位 |
去測試 | 運行測試 |
去FMT | 根據標準格式化程式碼 |
去看獸醫 | 檢測潛在錯誤 |
去模組初始化 | 初始化新模組 |
保持整潔 | 清理依賴關係 |
去拿 | 下載依賴項 |
去安裝 | 編譯二進位檔案並將其安裝到 $GOBIN 中 |
去讀書 | 查看文件 |
去生成 | 運行程式碼生成 |
去工作 | 工作區模式(多模組) |
# Xem docs của một package
go doc fmt
go doc fmt.Printf
# Format toàn bộ project
go fmt ./...
# Kiểm tra lỗi tiềm ẩn
go vet ./...
# Download và clean dependencies
go mod tidy
8. 編輯器設定
8.1. VS 代碼(建議)
// Cài extension: "Go" by Go Team at Google
// settings.json
{
"go.formatTool": "goimports",
"go.lintTool": "golangci-lint",
"go.useLanguageServer": true,
"editor.formatOnSave": true,
"[go]": {
"editor.defaultFormatter": "golang.go",
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
}
}
8.2. GoLand(JetBrains)
GoLand 是 Go 的專用 IDE,為調試、重構和測試提供最佳支援。適合大型專案。
8.3.必備工具
# golangci-lint - meta-linter (chạy 50+ linters)
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# air - live reload khi phát triển
go install github.com/air-verse/air@latest
# gotests - generate test stubs
go install github.com/cweill/gotests/gotests@latest
# mockery - generate mocks
go install github.com/vektra/mockery/v2@latest
# swag - Swagger docs generation
go install github.com/swaggo/swag/cmd/swag@latest
9. 基本 Go 模組
Go Modules(自 Go 1.11 起)是官方的依賴管理系統:
# go.mod - khai báo module và dependencies
module github.com/yourname/hello-go
go 1.23
require (
github.com/gin-gonic/gin v1.10.0
github.com/joho/godotenv v1.5.1
)
# Thêm dependency
go get github.com/gin-gonic/gin@latest
# Update dependency
go get -u github.com/gin-gonic/gin
# Remove unused dependencies
go mod tidy
# Vendor dependencies (copy vào project)
go mod vendor
10. 標準項目結構
西奧 golang 標準/專案佈局:
my-go-project/
├── cmd/ # Entry points (main packages)
│ ├── api/
│ │ └── main.go # API server
│ └── worker/
│ └── main.go # Background worker
├── internal/ # Private packages (không thể import từ ngoài)
│ ├── handler/ # HTTP handlers
│ ├── service/ # Business logic
│ ├── repository/ # Data access
│ └── model/ # Domain models
├── pkg/ # Public packages (có thể import)
│ └── validator/
├── config/ # Configuration files
├── migrations/ # Database migrations
├── api/ # API specs (OpenAPI, protobuf)
├── scripts/ # Build, deploy scripts
├── go.mod
├── go.sum
├── Makefile
├── Dockerfile
└── README.md
11. 總結
Go 是一種簡單但功能強大的語言,專為雲端原生時代而設計。 Go 具有快速編譯、內建並發、靜態二進位和豐富的標準函式庫,非常適合後端服務、微服務和基礎設施工具。
在下一篇文章中,我們將深入探討 變數、類型和控制流 ——Go 的語法基礎。