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