精通 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 长什么样。


全书地图

全书分五篇、二十个模块。每个模块内部又拆成若干子主题,每个子主题都是”问题 → 深挖 → 参考答案”的结构,章末配思考题和参考答案。

第一篇 内存与运行时

第二篇 并发与调度

  • 07 GMP 调度器 —— GM 改 GMP 为什么,工作窃取与抢占
  • 08 channel —— CSP 落地、内存模型、select 的精妙
  • 09 sync 全家桶 —— Mutex 自旋与饥饿、Once、WaitGroup、atomic 内存序
  • 10 context —— 取消、超时、值传递的边界

第三篇 语言设计

第四篇 网络与系统

第五篇 编译器与工程


阅读顺序建议

  • 想快速建立系统认知:按 01 → 02 → 03 → 04 → 07 → 08 的顺序读。这六章是 Go 运行时的骨架,读懂了它们,剩下的都是枝叶。
  • 想攻并发:直接跳到 07 → 08 → 09 → 15,这四章是一组,讲的是”Go 的并发模型到底建立在什么底层机制上”。
  • 想攻语言设计:11 → 12 → 13 → 14 是一组,讲的是”语法糖背后的决策”。
  • 每一章都相对独立,跳着读不会断。

关于思考题

每章末尾的思考题,不是用来测验你的,是用来当学习材料看的。参考答案我会写在思考题后面,但请一定先自己想过、甚至动手写过代码再去对答案——“被参考答案说服”和”自己先撞墙再看到答案”,吸收效果差一个数量级。

如果你觉得某道思考题没答上来,别急着翻答案,先回到正文里那个对应的机制,问自己一句:“如果让我重新设计一次,我会怎么做?为什么 Go 没这么做?“——这个问题问多了,你就慢慢从”会用 Go 的人”变成”能造出 Go 的人”了。

开卷吧。