主题
Go 学习路线
本目录是 Go 语言卷,00 只做导航。先讲语法、类型、错误和并发原语,再讲 GPM、逃逸和 GC,最后看 Go 在 AI 基础设施里的位置;顺序不是按题目排,而是按「写得出 → 用得住 → 知道为什么」排。
适用基线:Go 1.22+。选 1.22 是因为 for 循环变量改为每次迭代一份,闭包和 goroutine 的行为与更早版本不同;泛型从 1.18 开始,篇内会单独标注。版本相关的默认值和行为以官方文档和 Release Notes 为准。
一、章节与定位
| 篇 | 一句话定位 | 前置 |
|---|---|---|
| 01 语法基础与类型系统 | 声明、常量、零值、类型转换、string/byte/rune、控制流 | 无 |
| 02 复合类型 | 数组是值、切片三要素与别名、map 引用语义、struct 嵌入 | 01 |
| 03 函数、方法与接口 | 多返回值、闭包、defer、方法集、接口值 = 类型 + 数据 | 01、02 |
| 04 错误处理、defer 与 panic | error 是接口、%w 包装、errors.Is/As、panic 边界 | 03 |
| 05 泛型与类型参数 | 约束、comparable、~、类型推断、何时不该用 | 02、03 |
| 06 并发原语 | goroutine、channel/select、Mutex/WaitGroup、context 取消 | 03、04 |
| 07 Goroutine 与 GPM 调度 | G/P/M、异步抢占、sysmon、channel 运行时结构、泄漏排查 | 06 |
| 08 内存逃逸 | 逃逸判定、-gcflags="-m"、基准与分配 profile | 01、02、07 |
| 09 垃圾回收 | 三色标记、混合写屏障、GOGC/GOMEMLIMIT、gctrace | 07、08 |
| 10 模块、测试与工具链 | go mod、包与 internal、表驱动测试、-race、交叉编译 | 01–04 |
| 11 常见陷阱与工程惯例 | 11 个高频坑的「现象 → 原因 → 正确写法」 | 01–06 |
| 12 Go 与 AI | LLM 网关、MCP、Agent 控制面、推理路由;Go 适合与不适合的位置 | 06、10 |
每篇都有可运行的「最小上手」。先跑通,再读「核心机制」,最后用自己的话复述「讲清楚」。
二、四条阅读路径
路径 A:语法速通
按 01 → 02 → 03 → 04 → 05 读。
目标是一周内能独立写出带错误处理、接口和泛型的小程序,看到切片、map、闭包、defer 能说出行为。05 可以只读前两节,等真正要写通用容器时再回来。
验收:能解释 append 后两个切片为什么有时互相影响、nil 接口和 nil 指针为什么不同、%w 和 %v 的区别。
路径 B:工程上手
按 01 → 02 → 03 → 04 → 06 → 10 → 11 读,05 按需穿插。
目标是把代码放进一个可测试、可构建、能查并发问题的工程里。06 只讲原语和纪律,GPM 细节留到 07;10 的命令直接对着 examples/10_tooling 跑;11 当评审清单用。
验收:能建 module、写表驱动测试、用 -race 抓竞争、用 context 传播取消、给交叉编译产物。要做 AI 网关或工具服务时接 12。
路径 C:运行时深入
按 01 → 02 → 03 → 06 → 07 → 08 → 09 → 10 读。
目标是从「会用」走到「知道代价」:goroutine 为什么便宜、变量为什么上堆、GC 为什么有 STW 和写屏障。07–09 依赖 06 的 channel/context 语义,08 依赖 01/02 的值与指针,09 又依赖 07/08 的栈和堆概念。
验收:能画 G/P/M 关系,能用 -gcflags="-m" 解释一次逃逸,能读 gctrace 的一行输出并判断 GC 为什么变密。
路径 D:AI 基础设施
按 04 → 06 → 10 → 12 读,11 当并发和资源释放的检查表。
目标是能写一个 LLM 网关或 MCP 工具服务:会做 SSE 透传、客户端断开后取消上游、有界队列和优雅停机。12 不要求先读完 07–09;但要知道 goroutine 和 context 的成本,遇到连接数或内存问题再回 06–09。
验收:能解释「客户端断开 → 代理取消 → 上游停止生成」的链路,能指出网关里哪些超时不能照搬普通 HTTP 接口。
三、示例位置
所有示例在 examples/,每个目录一个可独立运行的程序:
| 示例 | 对应篇 | 运行 |
|---|---|---|
examples/01_syntax | 01 | go run examples/01_syntax/main.go |
examples/02_composite | 02 | go run examples/02_composite/main.go |
examples/03_functions_interfaces | 03 | go run examples/03_functions_interfaces/main.go |
examples/04_errors | 04 | go run examples/04_errors/main.go |
examples/05_generics | 05 | go run examples/05_generics/main.go |
examples/06_concurrency | 06 | go run examples/06_concurrency/main.go |
examples/10_tooling | 10 | cd examples/10_tooling && go test ./... |
examples/11_pitfalls | 11 | go run examples/11_pitfalls/main.go |
examples/12_ai_sse | 12 | go run examples/12_ai_sse/main.go |
07–09 的最小上手依赖 net/http/pprof、长时间运行和 profile 工具,代码在正文里,按篇内命令单独起进程。examples/10_tooling 是唯一带 go.mod 的子目录,用来演示包、测试和构建命令;12 的 SSE 示例只用标准库,直接 go run 即可。
四、环境
bash
go version # 1.22+;本目录示例在 Go 1.27.1 上验证
go env GOMODCACHE GOPROXY # 依赖缓存与代理
gofmt -w . # 提交前格式化读法建议:每篇先跑示例,再对照「核心机制」解释输出;遇到与版本相关的行为,先看篇内标注,再查官方文档,不要用旧博客的结论替代当前版本的验证。
适用 Go 1.22+ | 初稿 2026-10