精通 Go 设计:问答式深研教程
一本不讲语法、只讲”为什么”的 Go 教程。 每一个主题都当成一个悬而未决的工程难题来破:Go 当年遇到了什么麻烦,业界别人怎么解,Go 为什么选了另一条路,这条路后来暴露了什么新问题,Go 又是怎么一步步改的。 目标不是”会用 Go”,而是”能读懂 Go 设计者的决策,能自己造出这种级别的工具”。
这套教程怎么读
这套教程和你平时看的语法书、API 手册都不一样。它不是按 map、channel、defer 的字典顺序排的,而是按问题排的——每一章回答一个”Go 到底为什么这么干”的问题。
读之前,先接受三条约定:
第一条:你是来”被提问”的,不是来”被灌输”的。 每一章正文里,我不会一上来就把结论倒给你。我会先抛一个问题,让你自己先想三秒。你写 Go 五年,很多答案其实就在你脑子里,只是从来没被逼出来过。逼出来一次,比看十遍都牢。
第二条:每个结论都要问一句”代价是什么”。
Go 的设计几乎没有一个选择是免费的。连续栈解决了热分裂,代价是搬栈时要复制整块内存、要扫描更新指针;GC 做到了低延迟,代价是写屏障拖慢了写;interface 给了你多态,代价是装箱。学 Go 设计,最忌讳的是”记住这个特性很牛”,正确的是”记住这个特性牛在哪、贵在哪、边界在哪”。
第三条:跟着版本演进看,不要只看现状。 Go 1.3 的连续栈、1.5 的并发 GC、1.9 的 sync.Map、1.13 的栈上 defer、1.14 的开放编码、1.18 的泛型、1.21 的优化过的 clear 和 min/max 内建……每一个版本号背后都是一次”被现实逼出来的妥协”。你要学的是那个”被逼”的过程,而不是最终那个 API 长什么样。
全书地图
全书分五篇、二十个模块。每个模块内部又拆成若干子主题,每个子主题都是”问题 → 深挖 → 参考答案”的结构,章末配思考题和参考答案。
第一篇 内存与运行时
- 01 栈:从分段栈到连续栈 —— 热分裂是怎么被消灭的
- 02 逃逸分析 —— Go 敢”搬栈”的底气,也是 GC 减负的隐形功臣
- 03 内存分配器 —— 从 tcmalloc 到 size class,小对象为什么快
- 04 GC —— 从 STW 到混合写屏障,低延迟的代价
- 05 slice 与 string —— 共享底层数组的甜与雷
- 06 map —— 渐进式扩容与并发写崩溃之谜
第二篇 并发与调度
- 07 GMP 调度器 —— GM 改 GMP 为什么,工作窃取与抢占
- 08 channel —— CSP 落地、内存模型、select 的精妙
- 09 sync 全家桶 —— Mutex 自旋与饥饿、Once、WaitGroup、atomic 内存序
- 10 context —— 取消、超时、值传递的边界
第三篇 语言设计
- 11 interface —— itab 缓存、装箱开销、断言
- 12 泛型 —— 为什么迟到十年,类型集、约束、单态化取舍
- 13 defer —— 运行时 defer 到开放编码,一路提速
- 14 错误处理 —— 为什么不用异常,error 的演进与 wrap
- 15 内存模型与 happens-before —— 竞态的本质
第四篇 网络与系统
第五篇 编译器与工程
- 18 编译器优化 —— 内联、逃逸、边界检查消除、devirtualization
- 19 反射与 unsafe —— 性能边界与何时该用
- 20 工程演进 —— GOPATH 到 module、构建约束、cgo、工具链
阅读顺序建议
- 想快速建立系统认知:按 01 → 02 → 03 → 04 → 07 → 08 的顺序读。这六章是 Go 运行时的骨架,读懂了它们,剩下的都是枝叶。
- 想攻并发:直接跳到 07 → 08 → 09 → 15,这四章是一组,讲的是”Go 的并发模型到底建立在什么底层机制上”。
- 想攻语言设计:11 → 12 → 13 → 14 是一组,讲的是”语法糖背后的决策”。
- 每一章都相对独立,跳着读不会断。
关于思考题
每章末尾的思考题,不是用来测验你的,是用来当学习材料看的。参考答案我会写在思考题后面,但请一定先自己想过、甚至动手写过代码再去对答案——“被参考答案说服”和”自己先撞墙再看到答案”,吸收效果差一个数量级。
如果你觉得某道思考题没答上来,别急着翻答案,先回到正文里那个对应的机制,问自己一句:“如果让我重新设计一次,我会怎么做?为什么 Go 没这么做?“——这个问题问多了,你就慢慢从”会用 Go 的人”变成”能造出 Go 的人”了。
开卷吧。