Go 语法速查:从变量到 goroutine 的 Golang 速查实战
把 Go 常用语法整理成可搜索速查:变量、切片、map、struct、goroutine、channel、错误处理,加并发模型和 go 命令,按场景直接查直接抄,少绕弯路。
Go 语法速查:从变量到 goroutine 的 Golang 速查实战
我从 Node 转 Go 的第一周,最难受的不是语法,是肌肉记忆没跟上。写惯了 try/catch,到 Go 这边每个调用点都要手写 if err != nil;想并发起几个任务,又分不清该用 channel 还是 mutex。后来我把日常真在撸的写法整理成一份按分类筛的速查,卡壳时直接搜关键词,抄一段改改就能跑。这篇就把这份速查的脉络讲清楚,你照着顺序过一遍,基本能上手写真东西。
基础:变量、切片、map、struct 一次过
Go 的基础块很紧凑。变量两种写法:函数外用 var x int,函数内用短声明 x := 10。常量配 iota 写枚举特别顺手:
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
)
切片是 (指针, len, cap) 的视图,不是数组本身,这点决定了它会跟别的切片共用底层数组。map 用 make(map[string]int) 初始化,读不存在的键拿零值,要区分"不存在"和"值是零"就用 comma-ok:v, ok := m[key]。struct 带 tag 是 JSON 序列化的关键:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
零值规则要记牢:int 是 0,string 是空串,指针和 map 是 nil。很多 panic 都来自对 nil map 直接写。
错误处理:Go 最高频的那行代码
if err != nil 是 Go 代码库里出现次数最多的片段。包装错误用 fmt.Errorf 加 %w,判断用 errors.Is 穿透整条链:
if err != nil {
return fmt.Errorf("查用户失败: %w", err)
}
// 调用方
if errors.Is(err, sql.ErrNoRows) {
// 处理找不到
}
这里有个要记一辈子的坑:在返回 error 的函数里,没错的路径一律 return nil,绝不 return 一个类型化的 nil 指针。因为接口值是 (类型, 值) 二元组,只有两者都为 nil 才等于 nil;返回 var p *MyError = nil,接口带着非 nil 的类型,调用方的 if err != nil 直接成立。
并发特色:goroutine 与 channel
这是 Go 存在的理由。go 关键字一个字就起一个并发执行单元,匿名函数立即执行的经典写法是 go func(){ ... }()。多个 goroutine 等齐用 sync.WaitGroup:
var wg sync.WaitGroup
for _, job := range jobs {
wg.Add(1)
go func(j Job) {
defer wg.Done()
process(j)
}(j)
}
wg.Wait()
channel 负责在 goroutine 之间传值。无缓冲 channel 收发必须配对,否则同一 goroutine 内自死锁;带缓冲的 make(chan int, 8) 能攒一批再处理。select 同时等多个 channel,但热循环里别给它写裸 default,那会把 CPU 打到 100% 忙轮询,要等就用阻塞接收或 time.After 分支。
channel 和 mutex 不是二选一:传值的所有权(任务队列、取消信号)用 channel,多个 goroutine 读写同一块共享数据(计数器、缓存)用 sync.Mutex。按场景挑原语,别站队。
go 命令:每天都在敲的几条
Go 的工具链都在 go 这一个命令下:go run main.go 直接跑,go build 出二进制,go test ./... 跑全量测试,go test -bench . -benchmem 带内存统计跑基准,go mod tidy 整理依赖,go vet 静态检查。表驱动测试配 t.Run 子测试是社区默认范式,一个函数覆盖一组用例,失败时能精确定位到哪条。
按场景查:这份速查怎么用
我自己最常见的三种场景。一是迁移服务撞上满屏 err 判断,筛到「错误」和「控制流」,把 %w 包装和 errors.Is 一遍抄走。二是搭 worker pool 清积压任务,去「channel」分类拿带 close jobs 和 WaitGroup 的模板,worker 数设成核数。三是给永远挂死的 HTTP 客户端加超时,用 context.WithTimeout 配 defer cancel,注意创建 context 的下一行就把 defer cancel() 补上,忘了它会泄漏 goroutine。
完整的 100+ 段地道代码、十二大分类、还有 12 个真烧时间的坑,都在 Go (Golang) 速查表 里,搜索框跨标题、代码、中英说明一起过滤。如果你的技术栈不止 Go,Python 速查表 能一起搭着看,迁移和对照时省不少来回。
希望这份脉络能帮你把 Go 从"看得懂"推到"敢动手写"。卡住时别硬记,搜一下,抄一段,改成自己的。
Made by Toolora · Updated 2026-06-13