Go 程序员硬核修炼手册 · 总纲

这不是一本”教你用工具”的书。 这是一本教你造工具的书。 读完这 8 章,你应该具备一个能力:当行业里没有现成方案时,你能自己设计一个。


一、先说清楚:这份教程要解决的问题

五年的 Go 开发经验,会带来一个很隐蔽的瓶颈。

你写得快,你调得动,你知道 sync.Pool 能复用对象,知道 context 要一路传下去,知道 select 的随机分支选择,知道逃逸分析会让某些变量上堆。你能独立完成一个服务从设计到上线的全过程。

但如果有人问你下面这些话,你可能会卡住:

  • “为什么 Go 的 GC 要用混合写屏障?直接 STW 不行吗?”
  • “如果让你从零设计一个分布式搜索引擎——不是用 ES,是你自己写——你怎么设计倒排索引的分片策略?”
  • “Raft 里为什么要限制 leader 只能提交当前 term 的日志?不限制会怎样?”
  • “epoll 的 LT 和 ET 模式,本质区别到底在哪一层?”
  • “MySQL 的 MVCC 是怎么做到’读不加锁’的?如果让你用 Go 实现一套,你怎么做?”

这些问题的共同点是:它们问的不是”怎么用”,而是”为什么这样设计”以及”换我来怎么设计”。

这份教程的全部内容,都在回答这一类问题。

你会得到什么

  1. 一套完整的计算机系统心智模型——从晶体管开关到分布式共识,中间没有断层。
  2. 一批自己手写的 Go 系统——内存分配器、编译器、GC、存储引擎、Raft、容器运行时、IoC 框架、流媒体管线。不是玩具,是能跑、能压测、能讲清设计取舍的真东西。
  3. 一种提问能力——遇到问题不再问”用什么库”,而是问”这个约束条件下,最优解应该长什么样”。
  4. 给行业提供方案的能力——当现有的 ES、Kafka、Redis 都不满足你的场景时,你能说出”我要造一个什么样的东西”,并且造得出来。

二、这份教程的人物与形式

全书采用对话体。两个人:

小林

五年 Go 开发经验。写得一手漂亮的并发代码,但对底层一知半解。他的特点是不满足于”能跑就行”,总要追问一层。他的困惑,大概率也是你的困惑。

老陈

二十年系统老兵。写过编译器,调过内核,设计过分布式存储。他的特点是几乎从不直接给答案——他先反问,让你自己撞墙,撞完了再一起拆。

这不是故弄玄虚。 一个你没撞过墙的答案,你记不住。 所以书里大量的”废话”和”绕弯”,是刻意的。如果你觉得老陈某个反问很啰嗦,先停一下,自己试着答——答不上来的地方,就是你真正的知识缺口。

每一节的标准结构

┌─ 开场对话       小林遇到一个真实困境(通常来自生产事故或面试)
│
├─ 追问链         老陈连续反问,把问题逼到根上(3~5 层)
│
├─ 正解拆解       原理讲解 + 源码/硬件层面的证据
│                  · 穿插 Go 代码实验
│                  · 穿插真实系统的设计取舍对比
│
├─ 动手实验       一个可运行的 Go 程序,验证刚讲的东西
│
├─ 思考题         3~5 道,分三层:
│                 【理解层】我能复述和解释吗
│                 【应用层】我能在新场景用上吗
│                 【创造层】我能改进或重新设计吗
│
└─ 参考答案       每道题都给,但建议先自己想 10 分钟再看

三、八章地图

章节覆盖课程核心产出(用 Go 手写)字数
第 1 章 计算机底层操作系统实战45讲、趣谈Linux操作系统、深入C语言和程序运行原理、编程高手必学的内存知识、编译原理之美、编译原理实战课操作系统内核引导 + 内存分配器 + C 编译器 + 链接器3.5 万
第 2 章 数据结构与算法数据结构与算法之美(深度扩展)完整算法库 + 索引结构族 + 图算法引擎3.2 万
第 3 章 语言运行时深入拆解JVM、图解V8、JavaScript核心原理解析、重学前端、浏览器工作原理与实践Go 版 GC + 字节码虚拟机 + 逃逸分析器3.5 万
第 4 章 存储引擎MySQL实战45讲、Redis核心技术与实战B+Tree 引擎 + WAL + MVCC + LSM-Tree(≈自己的 ES)3.6 万
第 5 章 网络与分布式网络编程实战、分布式技术原理与算法解析、etcd实战课epoll 网络框架 + RPC + Raft 完整实现3.6 万
第 6 章 系统与性能Linux性能优化实战、容器实战高手课容器运行时 + eBPF 观测 + 性能剖析工具链3.2 万
第 7 章 框架设计小马哥讲Spring核心编程思想、手把手带你写一个MiniSpring、手把手带你写一个MiniTomcatGo 版 IoC/AOP 框架 + Web 容器3.3 万
第 8 章 架构与多媒体许式伟的架构课、攻克视频技术、搞定音频技术架构决策框架 + 音视频流水线 + 直播系统3.2 万

合计约 27 万字。


四、关于”Java 和前端课为什么要学”的说明

25 门 S 级课里,Java 系 4 门,前端/JS 系 4 门,直接跟 Go 相关的只有 2 门。你可能会问:我是 Go 程序员,学这些干嘛?

我的处理方式是:保留全部 25 门,但把落点全部转到 Go。

理由如下:

JVM 那门课,学的是”如何设计一个语言的运行时”

Java 语法你可能一辈子用不上,但下面这些东西,你天天在用:

JVM 的概念Go runtime 的对应物
分代收集假说Go 没有分代,为什么?Go 的假设是什么
CMS 的并发标记Go 的三色标记 + 混合写屏障
可达性分析Go 的 GC Roots 是什么
类加载 / 双亲委派Go 的编译期静态链接,取舍在哪
JIT 热点编译Go 的编译优化 + PGO

学完这一章,你要能回答:“如果 Go 的 GC 停顿还是太长,给我六个月,我怎么改?“

Spring 那三门课,学的是”依赖管理与横切关注点”

IoC/DI/AOP 不是 Java 的专利。Go 生态里的 google/wire(编译期 DI)、uber-go/dig(运行期 DI)、uber-go/fx(应用框架),本质上就是 Spring 那套思想在 Go 里的重新表达。

学完这一章,你要能用 Go 手写一个 DI 容器,并且说清楚它和 wire 的设计差异在哪、各自适合什么场景。

V8 和浏览器那两门,学的是”执行引擎与并发模型”

V8 的隐藏类(Hidden Class)和内联缓存(Inline Cache),本质是在解决”动态类型语言的属性访问太慢”。Go 是静态类型,没有这个问题——但 Go 的 interface{} 有类似的动态分发开销。

浏览器的事件循环,和 Go 的 GMP 调度器,是两种截然不同的并发哲学。理解两者的取舍,你才能说清楚”什么场景下 Node.js 的单线程事件循环反而比 Go 的 goroutine 更合适”。


五、贯穿全书的七个问题

读完 8 章,你应该能完整回答这七个问题。建议每隔一段时间回来看看自己答到什么程度:

  1. 程序是怎么跑起来的? 从 go build 到 CPU 执行一条指令,中间每一步发生了什么。

  2. 内存是怎么被管理的? 从虚拟地址到物理页框,从 malloc 到 GC,谁在什么时候做了什么决定。

  3. 为什么会有”并发”这个难题? 从缓存一致性协议到内存屏障,从 happens-before 到分布式共识——本质上是同一个问题的不同尺度。

  4. 数据存到哪里去了? 从 B+Tree 的页分裂到 LSM 的 compaction,从 WAL 到 Raft 日志,持久化的本质是什么。

  5. 快,是怎么做到的? 从局部性原理到零拷贝,从批处理到流水线,所有优化手段背后是哪几个不变的思路。

  6. 复杂度是怎么被控制的? 从分层到依赖倒置,从接口隔离到领域建模,“好架构”的判断标准到底是什么。

  7. 什么情况下,我应该自己造? 这是最后一章的核心。造轮子的时机判断,比造轮子的能力更稀缺。


六、怎么读这份教程

建议顺序

严格按 1→8 走。第 1 章是最难的,也是最重要的。如果第 1 章你能啃下来,后面会越读越快。

时间预算

按每周一章的节奏,大约两个月。每天 1.5~2 小时,其中:阅读 40%,写代码 40%,做思考题 20%。

如果你只读不写,这份教程对你的价值会掉到 20%。 书里所有的 “aha moment” 都藏在代码里,不在文字里。

环境要求

go version          # 1.21+
gcc / clang         # 第 1 章需要 C 编译器
docker              # 第 6 章需要
Linux 或 WSL2       # 第 1、5、6 章的部分实验需要 Linux 环境

代码仓库建议

~/gohard/
├── ch01-kernel/        第 1 章:内核、编译器、内存分配器
├── ch02-algo/          第 2 章:算法库
├── ch03-runtime/       第 3 章:GC、虚拟机
├── ch04-storage/       第 4 章:存储引擎 ★ 核心
├── ch05-distributed/   第 5 章:网络框架、Raft ★ 核心
├── ch06-perf/          第 6 章:容器、观测工具
├── ch07-framework/     第 7 章:IoC 框架、Web 容器
└── ch08-media/         第 8 章:音视频管线

带 ★ 的两章是最能”变现”的——学完你手上就有了自己的分布式存储和自己的共识库。


七、最后一句

这份教程里会出现很多”老陈的反问”。有些反问你可能要憋很久才能答上来,有些甚至看到参考答案都觉得不服气。

都正常。

真正的系统能力,不是知道很多答案,而是在没人给答案的时候,知道该往哪个方向挖。

开始吧。


本教程基于极客时间 229 门专栏课程中评定为 S 级的 25 门硬核课程重新组织,面向有 5 年 Go 经验的工程师,全部示例与动手实验以 Go 为实现语言。