Chuyển đến nội dung chính

第 1 課:Go 簡介 - 雲端原生語言

為什麼要去?與 Rust、Java、Python 進行比較。歷史、設計理念、Go 生態系。安裝、GOPATH、Go 模組。你好世界和去工具鏈。

💻 程式設計 — 第 1 課 第 1 課:Go 簡介 - 雲端語言 本地人

Golang:從基礎到高級

第 1 部分:Go 基礎知識

亞洲開發網

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 的產品
GoogleKubernetes、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-15MBJRE+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 的語法基礎。