README
# 卷一《语法卷:现代 Go 基础入门》总目录与导读
本卷是《现代 Go 由浅入深:从入门到工程精通》四卷本的第一卷。 目标:让你在 18 章篇幅内,把"会读 Go 代码"升级到"会写符合工业界习惯的 Go 代码"。 阅读层级:0 基础学生 → 转语言工程师(Java/Python/C++ 转 Go)→ 已写过 Go 但想系统补漏的开发者。
# 目录介绍
- 01.卷一定位与读者画像
- 02.卷一 18 章总目录
- 03.章节与文件映射表
- 04.学习路径与时间预算
- 05.卷一读者承诺与边界
- 06.每章统一结构
- 07.如何与卷二、三、四衔接
- 08.卷一改造完成度(目录连贯性自检表)
# 01.卷一定位与读者画像
# 1.1 卷一在四卷本中的位置
《现代 Go 由浅入深:从入门到工程精通》
┌──────────────────────────────────────────────────────────┐
│ 卷一《语法卷》 ← 你在这里 │
│ · 现代 Go 怎么写 │
│ ↓ │
│ 卷二《工程卷》 · 项目怎么组织(12 个完整项目) │
│ ↓ │
│ 卷三《底层卷》 · runtime / 调度 / GC / 编译器 │
│ ↓ │
│ 卷四《实战卷》 · 上线后怎么调与怎么活 │
└──────────────────────────────────────────────────────────┘
2
3
4
5
6
7
8
9
10
11
12
卷一的角色是"语言地基":
- 不是 Tour of Go 的复刻——我们以 Go 1.22 为基线,泛型(1.18+)、内置
clear/min/max(1.21+)默认就是要会的,所有"老 Go 写法(如interface{}、手写 sort.Interface、io/ioutil)"会被明确标注为反例。 - 不深挖底层——GMP 调度、GC、map/channel 内部实现等内容全部留给卷三,本卷只讲"够用、能写"。
- 不讲项目工程化——Web 框架、ORM、CI/CD 放在卷二,本卷只用
go run与go test。
# 1.2 三类读者的不同读法
| 读者画像 | 推荐读法 | 预计耗时 |
|---|---|---|
| 零基础大学生 | 18 章顺序通读,每章动手敲 3-5 个代码示例 | 6-8 周 |
| C / C++ 转 Go | 重点读第 8(指针无算术)、9(接收者)、10(接口)、12-14(并发新世界)章 | 3-4 周 |
| Java / Python 转 Go | 跳过第 2-6 章细节,重点读第 8、10、11、12-14、16 章 | 2-3 周 |
# 1.3 读完卷一你将获得什么
- ✅ 读得懂任何 Go 1.22 风格的现代代码,认得出 90% 的关键字与语法
- ✅ 能独立写出 200-500 行的小型程序(CLI 工具、HTTP 小服务)
- ✅ 知道
slice/map/channel/interface/error的"正确打开方式" - ✅ 知道 为什么不该 用
interface{}、init()滥用、panic当 throw、共享内存代替通信 - ✅ 具备进入卷二(项目实战)和卷三(runtime 原理)的全部前置知识
# 02.卷一 18 章总目录
第 18 章
18.特性图谱.md作为附录性"特性速览"贴在最末,配合全卷复盘。
# 2.1 第一篇 开篇(第 1 章)
| 章 | 文件 | 关键词 |
|---|---|---|
| 第 1 章 | 01.Go简史.md | Go 1.0/1.5 自举/1.11 modules/1.18 泛型/1.21 内置/1.22 range int |
# 2.2 第二篇 基础语法(第 2-6 章)
| 章 | 文件 | 关键词 |
|---|---|---|
| 第 2 章 | 02.基础语法.md | package、import、go run/build/mod、现代 Hello World |
| 第 3 章 | 03.数据类型.md | int/uint 系列、float、string、rune、byte、零值、类型转换 |
| 第 4 章 | 04.运算符.md | 算术/比较/逻辑/位运算、&/*、为什么 Go 没有指针算术 |
| 第 5 章 | 05.复合类型.md | array/slice/map/struct/string 底层、为什么 slice 不是数组 |
| 第 6 章 | 06.流程语句.md | if-init、for 三种形态、range、switch 自带 break、标签 |
# 2.3 第三篇 函数与作用域(第 7-9 章)
| 章 | 文件 | 关键词 |
|---|---|---|
| 第 7 章 | 07.函数.md | 多返回值、命名返回、变长参数、闭包、defer 求值时机 |
| 第 8 章 | 08.指针与逃逸.md | &/*、不能算术、栈逃逸到堆、go build -gcflags="-m" |
| 第 9 章 | 09.结构体与方法.md | 值接收者 vs 指针接收者、嵌入字段、Tag、== 可比较性 |
# 2.4 第四篇 接口与错误(第 10-11 章)
| 章 | 文件 | 关键词 |
|---|---|---|
| 第 10 章 | 10.接口与多态.md | duck typing、空接口 any、类型断言、类型 switch、接口值的两个指针 |
| 第 11 章 | 11.错误处理.md | error 接口、errors.Is/As、%w 包装、panic/recover 边界 |
# 2.5 第五篇 并发三件套(第 12-14 章)
| 章 | 文件 | 关键词 |
|---|---|---|
| 第 12 章 | 12.并发goroutine.md | go 关键字、GMP 速览、WaitGroup、context 取消 |
| 第 13 章 | 13.通道channel.md | 有缓冲/无缓冲、select、关闭语义、nil channel 妙用 |
| 第 14 章 | 14.同步sync包.md | Mutex/RWMutex/Once/WaitGroup/atomic/sync.Pool |
# 2.6 第六篇 库与工程化(第 15-18 章)
| 章 | 文件 | 关键词 |
|---|---|---|
| 第 15 章 | 15.IO和文件.md | io.Reader/Writer、bufio、os.File、io/fs、embed |
| 第 16 章 | 16.标准库与泛型.md | slices/maps/cmp、泛型语法、类型约束、comparable |
| 第 17 章 | 17.工程化与模块.md | go.mod/go.sum/workspace/build tag///go:generate |
| 第 18 章 | 18.特性图谱.md | Go 1.0→1.22 全部关键特性按"使用频度 × 重要性"打分 |
# 03.章节与文件映射表
| 文件 | 书稿章节 | 改造重点(详见各章末尾"卷一改造增补") |
|---|---|---|
README.md(本文件) | 卷首导读 | 全新创建 |
01.Go简史.md | 第 1 章 | 全新创建 |
02.基础语法.md | 第 2 章 | 直接以 go mod init 起手,不教 GOPATH |
03.数据类型.md | 第 3 章 | 增补 rune vs byte、int 平台依赖性 |
04.运算符.md | 第 4 章 | 增补「为什么 Go 没有 ++i、没有指针算术」 |
05.复合类型.md | 第 5 章 | 增补 slice 底层三元组(ptr/len/cap)、map 不可寻址 |
06.流程语句.md | 第 6 章 | 增补 Go 1.22 for i := range N 整数遍历 |
07.函数.md | 第 7 章 | 增补 defer 求值时机三连问、recover 必须配 defer |
08.指针与逃逸.md | 第 8 章 | 全新视角:指针是"安全且能逃逸"的 |
09.结构体与方法.md | 第 9 章 | 增补「接收者选择决策表」、可比较性陷阱 |
10.接口与多态.md | 第 10 章 | 强化「接口值是 (itab, data) 两个指针」、nil 接口 vs nil 值 |
11.错误处理.md | 第 11 章 | 增补 errors.Join(Go 1.20+)、何时用 panic |
12.并发goroutine.md | 第 12 章 | GMP 速览(详见卷三)、context.WithCancelCause(1.20+) |
13.通道channel.md | 第 13 章 | 增补「关闭只读 channel 的编译错误」、扇入扇出模式 |
14.同步sync包.md | 第 14 章 | 增补 sync.OnceFunc/OnceValue(1.21+) |
15.IO和文件.md | 第 15 章 | 增补 io/fs、embed、os.ReadFile 替代 ioutil |
16.标准库与泛型.md | 第 16 章 | 全新视角:先讲 slices/maps,再讲泛型怎么写 |
17.工程化与模块.md | 第 17 章 | 增补 go work、最小版本选择算法 MVS |
18.特性图谱.md | 第 18 章 | 全新创建(卷一与后三卷的总索引) |
# 04.学习路径与时间预算
# 4.1 8 周学习计划(推荐)
Week 1: 第 1-2 章 开篇 + go mod + Hello World(每天 1-2 小时,跑通 3 个示例)
Week 2: 第 3-4 章 数据类型 + 运算符(每天 2 小时,做小练习)
Week 3: 第 5-6 章 复合类型 + 流程(重点:slice / map / range)
Week 4: 第 7-8 章 函数 + 指针逃逸(每章配 5 道思考题)
Week 5: 第 9-10 章 结构体 + 接口(重点:接收者选择 / 接口隐式实现)
Week 6: 第 11-12 章 错误处理 + goroutine(重点:errors.Is、context 取消)
Week 7: 第 13-15 章 channel + sync + IO
Week 8: 第 16-18 章 泛型 + 工程化 + 特性图谱(边读边查)
2
3
4
5
6
7
8
# 4.2 速读模式(已有后端语言基础)
Day 1: 第 1、18 章(看演进 + 特性图谱)
Day 2: 第 5(slice/map)、7(defer)、8(逃逸)、9(接收者)章
Day 3: 第 10(接口)、11(错误)章
Day 4: 第 12(goroutine)、13(channel)、14(sync)章
Day 5: 第 16(泛型)、17(工程化)章
2
3
4
5
# 4.3 三种典型读者路线
零基础学生: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13 → 14 → 15 → 16 → 17 → 18
C / C++ 转 Go: 1 → 8(指针无算术)→ 5(slice)→ 9(接收者)→ 10(接口 vs 虚函数)→ 11(无异常)→ 12-14 → 18
Java / Python 转:1 → 5 → 7 → 8 → 10(接口隐式)→ 11 → 12-14 → 16 → 18
2
3
# 05.卷一读者承诺与边界
# 5.1 本卷会教你的
- ✅ 现代 Go 的"日常写法"(Go 1.22 为主,关键 1.18-1.23 特性预告)
- ✅ 所有基础语法、关键字、修饰符的实际用法和取舍
- ✅ 常见陷阱(slice 共享底层数组 / 闭包变量捕获 / nil 接口 / goroutine 泄漏)的识别与回避
- ✅ 标准库高频包(
fmt/strings/io/os/sync/context/errors/slices/maps)的使用 - ✅ "如果做错了会怎样"——每章末尾「Go 新手陷阱 Top 5」
# 5.2 本卷不会展开的
下表的内容会被提到、留链接,但展开讲的是后三卷:
| 主题 | 在哪一卷讲 |
|---|---|
| GMP 调度器、抢占机制 | 卷三第 6 章 |
| GC 三色标记、写屏障、混合屏障 | 卷三第 7 章 |
channel 源码(hchan / sudog) | 卷三第 8 章 |
sync.Mutex / RWMutex / WaitGroup 源码 | 卷三第 9 章 |
map 源码(hmap / bmap / overflow) | 卷三第 10 章 |
| 泛型实现原理(GC shape / dictionary) | 卷三第 11 章 |
context 取消传播链 | 卷三第 12 章 |
反射与 unsafe 边界 | 卷三第 13 章 |
panic/recover 栈展开 | 卷三第 14 章 |
| netpoller / epoll 集成 | 卷三第 15 章 |
| 编译器、汇编、链接器 | 卷三第 16 章 |
| pprof / trace / Delve / OOM 排查 | 卷四全卷 |
| Web 框架 / ORM / 微服务 | 不在本系列范围 |
如果你在卷一读到某个概念觉得"没讲透",不是漏写,而是刻意延迟——在该处会有"➡ 展开见 卷三第 X 章"的指引。
# 06.每章统一结构
为了便于阅读和复习,卷一从第 2 章开始,所有章节都遵循以下统一结构:
1. 章节目录(自动生成的锚点链接)
2. 本章学习目标(3-5 条 bullet)
3. 主体内容(按 N.1 / N.2 / N.3 ... 分节)
每个三级小节内部:
· 概念解释
· 至少 1 个完整可运行示例(含 package main)
· "综合思考"小练习
4. 本章底层原理(简介,详见卷三)
5. 章末「Go 新手陷阱 Top 5」
6. 思考题(5-10 题)
7. 推荐阅读(卷内 / 跨卷链接)
2
3
4
5
6
7
8
9
10
11
**章末「Go 新手陷阱 Top 5」**是本书相比传统 Go 教材最大的差异之一——它直接告诉你"哪些代码 编译过 / 跑得通 / 但是错的"。
例如第 12 章末尾:
// ❌ 共享变量陷阱(Go 1.21 及之前的"史诗级"坑)
for _, v := range slice {
go func() { fmt.Println(v) }() // 所有 goroutine 打印同一个 v
}
// ✅ Go 1.22 起 v 每轮迭代是新变量,不再有此问题
// 但你仍然要懂为什么旧版本是错的,因为你会维护老代码
2
3
4
5
6
7
# 07.如何与卷二、三、四衔接
| 卷一章节 | 卷二对应 | 卷三对应 | 卷四对应 |
|---|---|---|---|
| 第 5 章 复合类型 | — | 第 4 章 字符串与切片底层 | — |
| 第 8 章 指针与逃逸 | — | 第 2 章 指针与逃逸分析 | 第 9 章 性能优化 |
| 第 9 章 结构体与方法 | 第 1-3 章 OOP 案例 | 第 3 章 结构体与对齐 | — |
| 第 10 章 接口与多态 | 第 3 章 多态首用 / 第 8 章 策略模式 | 第 5 章 接口与类型系统 | — |
| 第 11 章 错误处理 | 第 4、10、11 章 | 第 14 章 错误与 panic 机制 | 第 2 章 panic 全景图 |
| 第 12 章 goroutine | 第 7、9 章 | 第 6 章 GMP 调度器 | 第 5 章 goroutine 泄漏 |
| 第 13 章 channel | 第 9 章 协程池 | 第 8 章 channel 源码 | — |
| 第 14 章 sync 包 | 第 4、7、9 章 | 第 9 章 sync 源码 | — |
| 第 15 章 IO 与文件 | 第 2、4、6、12 章 | 第 15 章 网络 IO | — |
| 第 16 章 泛型 | 第 9、10 章 | 第 11 章 泛型实现 | — |
| 第 17 章 工程化 | 卷二全卷 | 第 16 章 编译链接 | 第 11 章 PGO |
| 第 18 章 特性图谱 | (索引性章节) | (索引性章节) | (索引性章节) |
读者完成卷一后,可以根据兴趣选择任意一卷继续深入;建议优先级:
工程师: 卷二(项目)→ 卷四(实战)→ 卷三(底层)
学生 / 面试: 卷三(底层)→ 卷四(实战)→ 卷二(项目)
团队 Lead: 卷四(实战)→ 卷二(项目)→ 卷三(底层)
2
3
# 卷首寄语
"Go is about composition. Java is about types. C++ is about features." — Rob Pike
Go 的入门曲线之所以平缓,是因为它故意舍弃了大量"花哨特性"——没有继承、没有泛型(直到 1.18)、没有异常、没有运算符重载——它把语法精简到只有 25 个关键字,同时把"工业实践"内置:gofmt 干掉了所有缩进战争,go test 干掉了选型纠结,go mod 干掉了依赖管理之争。
但正是这种"少即是多"的哲学,反而让从 Java / C++ 转过来的工程师不适应——你会发现"我以前那么写不行了":
- 没有继承,怎么实现"是一个"关系?→ 接口隐式实现 + 嵌入字段(第 9-10 章)
- 没有异常,错误怎么传?→ 多返回值 + error 接口(第 11 章)
- 没有线程,怎么并发?→ goroutine + channel(第 12-13 章)
本卷会从第一行代码就用 Go 1.22 的现代写法,让你不必先学一遍"过时的 Go"再忘掉它。
翻开第 1 章,让我们从 Go 的简史开始。
➡ 下一章:第 1 章 Go 简史与版本演进
# 08.卷一改造完成度(目录连贯性自检表)
本节记录卷一改造的完整轨迹,便于后续维护与读者交叉参考。
# 8.1 全新创建的章节(4 篇)
| 文件 | 行数预估 | 角色 |
|---|---|---|
01.Go简史.md | ~500 | 第 1 章 |
08.指针与逃逸.md | ~600 | 第 8 章(区别于 C++ 的指针章) |
16.标准库与泛型.md | ~700 | 第 16 章(合并 STL + 泛型视角) |
18.特性图谱.md | ~465 | 第 18 章 |
# 8.2 章节统一格式校验
- ✅ 文件名统一为
NN.4-8字.md格式 - ✅ 每篇正文章号(H1 与目录前缀)与文件序号同步:第 N 章 ↔
NN.xxx.md - ✅ 每章节末尾均统一为:主体内容 → 综合思考题 → 卷一改造增补 → Go 新手陷阱 Top 5 → 推荐阅读
- ✅ 跨章引用全部使用相对路径
# 8.3 后续维护清单
- 卷二开始撰写后,回填 §07 的卷二具体章节链接
- 卷三开始撰写后,回填 §07 的卷三具体章节链接
- 当 Go 1.23 / 1.24 引入新特性后,更新
18.特性图谱.md