Go 速查 — 簡明參考
Go 1.22 語法、類型、goroutine 與最常用標準庫速查手冊,覆蓋約 80% 日常場景。
Go Go 1.22
Go (gc toolchain) · 編譯型 · 併發 · 命令式 · 靜態 · 強類型 · 結構化(接口)
學習路徑
先學會 go run/build 與 go.mod 模塊 → 掌握變量、類型與流程控制 → 深入函數、指針與 struct → 用 slice/map 組織數據 → 理解接口與錯誤處理 → 用 goroutine/channel 寫併發 → 再按需學 http、context、時間與構建測試。FAQ 節適合回頭避坑。
1.Hello World 與構建環境
運行 Go 程序、go.mod 模塊與工具鏈。
最小程序
每個程序以 package main + func main 為入口。fmt 輸出。
運行與構建
go run 編譯並運行、go build 生成可執行文件、go install 安裝到 bin。
go.mod 模塊
go.mod 聲明模塊路徑與依賴。go mod init 初始化、go mod tidy 整理依賴。
包與導入
import 導入標準庫與第三方。同目錄文件同包。導入未使用報錯。
格式化輸出
fmt.Println/Printf/Print。Printf 動詞 %s %d %v。Sprintf 返回字符串。
參數與輸入
os.Args 命令行參數、flag 解析、fmt.Scan 讀取輸入。
多文件程序
同一目錄多 .go 文件屬於同包,可直接互相調用。文件共享包作用域。
工具鏈
go version 版本、go env 環境、go doc 文檔、go fmt 格式化。
2.變量與常量
變量聲明、短聲明、常量、零值與類型轉換。
變量聲明
var 聲明變量,類型在變量名後。聲明時必須初始化或給零值。
短變量聲明
:= 聲明並初始化,類型推斷。函數內使用,至少一個新變量。
常量
const 常量編譯期確定。iota 自增枚舉。常量可任意精度。
零值
未初始化的變量有零值:數字 0、字符串空串、bool false、指針 nil。零值可用。
多重賦值
一行賦值多個變量,支持交換。函數多返回值解包。
作用域
塊作用域:函數內變量僅在塊內可見。遮蔽 shadowing。包級變量。
類型轉換
T(x) 顯式轉換。Go 不隱式轉換數字類型。轉換可能溢出/截斷。
命名約定
首字母大寫導出(跨包可見),小寫包內私有。駝峯命名。短變量名。
3.數據類型
內置類型、struct、數組、接口與泛型。
基礎類型
bool、string、整數、浮點、複數、byte/rune 別名。
數值運算
算術運算、位運算、math 包。整數除法截斷。溢出檢查。
struct
struct 組合字段。命名字段 + 位置初始化。字段標籤 tag。
數組
數組定長、值類型(複製)。很少直接用,多數用 slice。
type 定義
type 定義新類型或別名。新類型與原類型不同(需轉換)。
泛型
泛型函數用 [T any] 類型參數。約束 interface 限定類型集合。
interface 類型
interface 定義方法集。空接口 interface{}(any)表示任意類型。
comparable 約束
comparable 內置約束:可用 == 比較的類型。map 鍵、泛型比較。
4.指針
指針與地址操作:取地址、解引用、new/make、棧與堆。
取地址 &
& 取變量地址返回指針。指針保存變量的內存位置。
解引用 *
*p 訪問指針指向的值。結構體指針自動解引用。
nil 指針
nil 指針是零值。解引用 nil 指針 panic。使用前判空。
指針參數
指針參數可修改調用方變量。值參數是副本。大結構體用指針省複製。
new 與 make
new 分配值類型返回指針。make 初始化 slice/map/channel。二者用途不同。
指針慣用法
指針用於共享可變狀態。返回指針或值看語義。方法接收者選擇。
棧與堆
編譯器決定變量在棧或堆。逃逸分析。取地址可能逃逸到堆。
指針安全
Go 指針無算術運算(禁止 C 風格 +1)。GC 管理生命週期,無懸垂指針。
5.流程控制
if、for、switch、defer 與循環控制。
if / else
if 條件無括號。可在條件前加初始化語句。條件必須是布爾。
for 循環
Go 只有 for。三種形式:完整、while 式、無限循環。
range 遍歷
range 遍歷數組/slice/map/字符串/channel。1.22+ 循環變量每次獨立。
switch
switch 無 break 穿透。case 多值、無表達式(if-else 鏈)、type switch。
defer
defer 延遲執行到函數返回。後進先出。清理資源常用。
break 與 continue
break 退出循環,continue 跳本輪。可帶標籤控制嵌套循環。
帶初始化 switch
switch 前可加初始化語句。條件與初始化合並。
goto 與標籤
goto 跳轉到標籤。Go 支持但少用。用於深度嵌套錯誤處理。
6.函數
函數定義、多返回值、閉包、方法、函數值。
函數定義
func 定義函數。參數帶類型,返回類型在最後。
多返回值
Go 函數可返回多個值。慣例返回 (值, error)。
命名返回值
返回值可命名。函數內直接賦值,return 裸返回。
可變參數
...T 收集任意數量參數為 slice。展開調用 slice...。
閉包
閉包捕獲外層變量。返回函數記住狀態。1.22+ 循環變量獨立捕獲。
方法
方法在類型上定義,接收者出現在 func 與函數名之間。
函數值
函數是一等公民:可賦值、傳參、返回。函數類型簽名。
init 函數
init 在包導入時自動執行。每個文件可有多個 init。用於初始化。
7.字符串
string 不可變、rune/字節、strings 包與格式化。
字符串基礎
字符串是不可變字節序列。雙引號字面量、反引號原始串。
rune 與字符
rune 是 Unicode 碼點(int32)。range 按 rune 遍歷。utf8 解碼。
strings.Builder
Builder 高效拼接字符串。避免 + 循環拼接產生垃圾。
strings 包
Contains/Split/Join/Trim/Replace 等字符串操作。
fmt 格式化
Printf/Sprintf 動詞。寬度、精度、填充。Fprintf 寫 io.Writer。
strconv 轉換
字符串與數字互轉、字符串與布爾互轉。轉義處理。
編碼處理
base64、hex、URL 編碼。bytes 與字符串互轉。
字符遍歷
按 rune 遍歷字符串處理中文。range 與字節索引的區別。
8.集合
slice、map、數組與排序。
切片 slice
slice 動態數組,引用底層數組。nil slice 可用。
切片操作
append 追加、copy 複製、刪除元素、插入。
make 與容量
make 創建切片並預分配容量。避免頻繁擴容。cap 容量增長策略。
map
map 鍵值對。make 創建、讀、寫、刪、遍歷。nil map 只讀不寫。
map 慣用法
map 做集合、計數、緩存。鍵值對收集。
排序
sort 包排序 slice。自定義比較函數。二分查找。
container 包
container/heap 堆、container/list 鏈表。數據結構需求。
遍歷技巧
range 遍歷、索引/值、map 鍵排序遍歷。
9.內存與性能
垃圾回收、逃逸分析、分配優化與內存分析。
垃圾回收
Go 自動 GC 無需手動釋放。併發 GC 低延遲。內存由運行時管理。
逃逸分析
編譯器決定變量分配位置。取地址/接口裝箱可能逃逸到堆。
分配優化
預分配容量、複用緩衝、減少小對象。熱路徑優化。
終結器
runtime.SetFinalizer 對象回收前清理。清理外部資源。
內存模型
併發下內存可見性。channel/鎖/atomic 提供同步保證。
內存分析
pprof 分析內存與 CPU。堆快照定位泄漏。
sync.Pool
Pool 複用臨時對象,降低 GC 壓力。適合短生命週期大對象。
棧與遞歸
goroutine 棧動態增長。遞歸深度受棧限制。大遞歸用迭代。
10.結構體與方法
Go 的 OOP:struct、接口、嵌入與組合(無類繼承)。
struct 與方法
struct 組合數據,方法綁定類型。構造慣用法。
接收者選擇
值接收者不修改原值。指針接收者修改原值。同類型方法接收者需一致。
接口
接口定義行為契約。類型實現接口的方法集即滿足接口。
接口與 nil
nil 接口 ≠ 含 nil 指針的接口。判空需反射或仔細處理。
嵌入
結構體嵌入字段提升方法。組合優於繼承。
組合
Go 用組合而非繼承組織複用。小接口組合大接口。
類型斷言
接口轉具體類型。ok 模式安全斷言。type switch 多分支。
any / 空接口
any(interface{})表示任意類型。存儲值後需斷言使用。
11.錯誤處理
error 接口、錯誤包裝、errors.Is/As、panic/recover。
error 接口
error 是內建接口:Error() string。返回錯誤而非拋異常。
返回錯誤
錯誤沿調用鏈返回。檢查 err != nil 並處理。
錯誤信息
fmt.Errorf 生成帶格式的錯誤。errors.New 簡單錯誤。
errors.Is
errors.Is 沿包裝鏈判斷錯誤是否匹配目標。取代 err == 判斷。
errors.As
errors.As 沿包裝鏈查找特定類型錯誤並提取。
panic 與 recover
panic 程序崩潰前恢復。recover 在 defer 中捕獲。僅用於不可恢復錯誤。
defer 錯誤處理
defer 中檢查錯誤。命名返回值讓 defer 可改返回值。
組合錯誤
errors.Join 合併多個錯誤為一個。多任務集中檢查。
12.輸入輸出
文件讀寫、bufio、JSON、io.Reader/Writer。
文件讀取
os.ReadFile 讀取整個文件。os.Open + Reader 逐行/流式。
文件寫入
os.WriteFile 整體寫入。os.OpenFile 追加。緩衝寫入。
JSON 序列化
json.Marshal 結構體轉 JSON。字段標籤控制字段名。
JSON 反序列化
json.Unmarshal 解析 JSON 到結構體/map。Decoder 流式解析。
io.Reader / Writer
io.Reader/Writer 抽象流。io.ReadAll、io.Copy 便捷函數。
bufio 緩衝
bufio 緩衝讀寫減少系統調用。Scanner 逐行、ReadString。
標準流
os.Stdin/Stdout/Stderr。fmt.Scan 輸入。命令行數據處理。
路徑操作
filepath 跨平台路徑處理。Join、Dir、Base、Ext。
13.常見誤區
Go 日常開發最容易踩的坑與正確寫法。
nil 與空 slice
nil slice 與空 slice 不同。JSON 序列化結果不同。用 make 明確意圖。
循環變量捕獲
goroutine 閉包捕獲循環變量(1.22 前共享)。1.22+ 每次迭代獨立。
map 遍歷無序
map 遍歷順序隨機。依賴順序需排序鍵。range map 順序不可預測。
字符串修改
字符串不可變,不能直接改。轉 []rune/[]byte 修改後轉回。
切片複製與共享
切片賦值共享底層數組。修改互相影響。copy 才複製元素。
忽略錯誤
忽略 err 導致靜默失敗。至少記錄或顯式 _ =。
接收者不一致
同類型方法混用值/指針接收者。接口實現不匹配。
變量遮蔽
:= 在內層作用域創建新變量,遮蔽外層。作用域不一致。
循環中 defer
循環內 defer 延遲到函數返回,資源堆積。用函數包裝或立即處理。
14.併發
goroutine、channel、select 與併發安全。
goroutine
go 關鍵字啓動併發函數。輕量級,棧動態增長。主函數退出程序即結束。
channel
channel 是 goroutine 通信管道。無緩衝 channel 收發同步阻塞。
緩衝 channel
make(chan T, n) 創建有緩衝 channel。滿則阻塞發送、空則阻塞接收。
select
select 多路等待 channel。隨機選擇就緒 case。default 非阻塞。
WaitGroup
sync.WaitGroup 等待一組 goroutine 完成。Add/Done/Wait。
互斥鎖
sync.Mutex 保護共享數據。Lock/Unlock。讀多寫少用 RWMutex。
sync.Once
sync.Once 保證函數只執行一次。懶初始化單例。併發安全。
數據競爭檢測
go run -race 檢測數據競爭。併發讀寫同一變量。
15.網絡
HTTP 請求、服務端、context 與 TCP。
HTTP GET
http.Get 發起 GET 請求。defer Body.Close 關閉響應體。
HTTP 服務端
http.HandleFunc 註冊路由。ListenAndServe 監聽端口。
HTTP 客户端
http.Client 配置超時與連接池。http.NewRequest 自定義請求。
JSON API
請求 JSON API 並解碼。自定義結構體字段標籤。
context
context 傳遞取消信號與超時。WithTimeout/WithCancel。貫穿網絡調用。
URL 解析
url.Parse 解析 URL。Query 讀取參數。URL 構建。
TCP Socket
net.Dial 客户端連接。net.Listen 服務端監聽。原始字節流。
路由增強
Go 1.22+ ServeMux 支持方法與路徑參數。http.ServeMux 模式匹配。
16.時間與日期
time 包、Duration、格式化與時區。
獲取時間
time.Now 返回 Time 值。可獲取各字段。UTC/Local。
Duration
time.Duration 是納秒整數。常量單位、加減、睡眠。
格式化
Time.Format 按佈局格式化。Go 用參考時間 2006-01-02 15:04:05。
解析
time.Parse 解析字符串為 Time。佈局需與參考時間匹配。
Ticker
time.Ticker 定時觸發。定期任務。Stop 停止,defer 關閉。
Sleep 與等待
time.Sleep 暫停當前 goroutine。隻影響當前 goroutine。
Timer
time.Timer 單次延時觸發。可停止、重置。超時取消。
時區
time.LoadLocation 加載時區。In 轉換。FixedZone 固定偏移。
17.進程與環境
命令行參數、環境變量、子進程與退出碼。
命令行參數
os.Args 是命令行參數切片。第一個是程序名。
flag 解析
flag 包解析命令行標誌。-name value、-flag。默認值。
環境變量
os.Getenv 讀取、os.Setenv 設置環境變量。LookupEnv 判斷存在。
退出碼
os.Exit 立即終止程序並設退出碼。0 成功、非 0 失敗。
運行子進程
exec.Command 運行外部命令。捕獲輸出、管道、環境。
信號處理
signal.Notify 捕獲系統信號。優雅退出。SIGINT/SIGTERM。
文件系統
os 目錄與文件操作。MkdirAll、RemoveAll、Rename、Stat。
工作目錄
os.Getwd 獲取當前目錄。Chdir 切換。絕對路徑處理。
18.正則表達式
regexp 包:編譯、匹配、查找、替換與分組。
編譯
regexp.Compile 編譯模式。MustCompile 編譯失敗即 panic。
匹配判斷
MatchString 判斷是否匹配。Match 匹配字節切片。
查找
FindString 返回第一個匹配。FindIndex 返回位置。
全部匹配
FindAllString 返回所有匹配。計數參數 -1 全部。
替換
ReplaceAllString 替換所有匹配。$1 引用分組。
分割
re.Split 按模式分割字符串。按數字/空白/逗號分割。
分組捕獲
括號分組提取子串。FindStringSubmatch 返回分組。命名分組。
常見模式
常用正則表達式與語法要點。字符類、量詞、錨點。
19.構建與測試
構建、單元測試、靜態檢查與跨平台編譯。
go build
go build 編譯包。輸出名、tags、靜態鏈接選項。
單元測試
go test 運行 *_test.go。testing 包。t.Error/t.Fatal。
基準測試
go test -bench 基準測試。Benchmark 函數、b.N 次數。
靜態檢查
go vet 檢查常見錯誤。格式化錯誤、可疑構造。CI 必跑。
格式化
gofmt 統一代碼風格。goimports 管理導入。格式化即標準。
交叉編譯
GOOS/GOARCH 跨平台編譯。一次源碼多平台二進制。
競態檢測
構建並啓用競態檢測器。運行時報告數據競爭。
模塊版本
go.mod 依賴版本管理。go get 更新、replace 替換、go.sum 校驗。
CI 集成
持續集成常見步驟。測試、lint、構建、發佈。
關於本速查
本頁是 Go 1.22 的自包含速查手冊,覆蓋語言核心與最常用標準庫在真實項目中約 80% 的常見用法。內容偏向現代慣用法:短變量聲明、結構化錯誤包裝(errors.Is / errors.As)、泛型,以及 1.22 起的每次迭代獨立循環變量。權威參考見官方 Go 教程與 Effective Go。 19 個章節各自聚焦一個主題——從第一個程序到 goroutine、接口與常見誤區。每節拆成 8–14 個帶示例的小節(每個 5–20 行),共約 150 個主題。代碼片段刻意短小、自解釋。 所有處理都在瀏覽器中完成——無上傳、無追蹤。本頁是 GuruToolkit 免費開發者工具集的一部分;代碼片段可自由使用,無任何擔保。
版本 2.1.0