Go Runtime Source Notes
Go 从请求到生产现场
如果你只会写一点 Go,也可以从这里开始。全系列只跟一件事:一个小服务收到请求后,同时抓取几个网页,再把结果汇总成 JSON。 我们先看代码“发生了什么”,再解释为什么会复制、等待、分配和复用连接,最后才进入标准库与 runtime 源码。
先把例子想成一张代办单:调用方交来两个网址;服务分别访问它们;两个结果回来后,服务再合成一份 JSON。 第一遍只跟“谁接到任务、谁开始工作、谁在等待、谁把结果交回来”;第二遍再把这些动作对应到标准库与 runtime 的名字。
两遍读法:如果你只学过变量、函数、结构体和基本循环,先读总路线前两节,再读每篇开头的请求回放与结论; 源码字段、队列细节和诊断实验可以留到第二遍。八篇仍建议按值语义、调度、并发、抽象、取消、内存、连接与诊断顺序阅读。
net/http 与 runtime
先看一次请求由谁接住、谁启动业务代码、谁等待网络;再进入 Server.Serve、Transport 与 netpoll 的真实交接。
slice 又共享了什么
从“复制一个 slice 后为什么还能改到原数据”开始,逐步讲清值复制、共享底层数据、append 扩容和 channel 发送。
goroutine 到底跑在哪里
先分清 goroutine、线程和并行数,再跟着 go h.fetch 看它怎样排队、运行、等待与被唤醒。
channel,什么时候锁
用“把结果交给别人”和“共同修改一份状态”两个例子,先选对 channel 或锁,再看阻塞、唤醒和背压怎样实现。
源码阅读 · 第五篇interface、泛型与反射的边界
从三个普通问题出发:只关心行为、复用同一算法、运行时才知道类型;再分别进入 interface、泛型与反射。
源码阅读 · 第六篇context 取消之后,goroutine 结束了吗
从“调用 cancel 后 worker 为什么还在”开始,分清发出停止信号、worker 退出、资源清理和等待全部结束。
源码阅读 · 第七篇 一个请求为什么在堆上先理解“放到堆上”不是报错,再追踪对象为什么活得更久、怎样分配,以及分配过快时 GC 为什么会影响请求延迟。
源码阅读 · 第八篇 连接复用之后,瓶颈藏在哪里从“明明复用了连接,请求为什么还在等”开始,分清连接、HTTP/2 stream 与流控,再学会用证据定位慢在哪一层。
全系列八篇已经完成:同一个 fetchd 请求从值语义、调度、并发原语、抽象边界与取消协议,
一直走到分配/GC、连接复用、HTTP/2 和生产诊断;每篇都配有双语源码笔记、可运行实验与成对插图。






