跳到主要内容

Go 语法速查:从变量到 goroutine 的 Golang 速查实战

把 Go 常用语法整理成可搜索速查:变量、切片、map、struct、goroutine、channel、错误处理,加并发模型和 go 命令,按场景直接查直接抄,少绕弯路。

发布于 作者 李雷
#go #golang #速查表 #并发 #后端

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.WithTimeoutdefer cancel,注意创建 context 的下一行就把 defer cancel() 补上,忘了它会泄漏 goroutine。

完整的 100+ 段地道代码、十二大分类、还有 12 个真烧时间的坑,都在 Go (Golang) 速查表 里,搜索框跨标题、代码、中英说明一起过滤。如果你的技术栈不止 Go,Python 速查表 能一起搭着看,迁移和对照时省不少来回。

希望这份脉络能帮你把 Go 从"看得懂"推到"敢动手写"。卡住时别硬记,搜一下,抄一段,改成自己的。


Made by Toolora · Updated 2026-06-13