《Go 语言编程入门》全 61 篇,是一套以一个真实项目为主线的 Go 入门书:从第 1 章
go mod init taskapi起,到第 18 章打包上线,TaskAPI 会一路长大——内存版存储、拆包分层、接口抽象、并发安全、HTTP 服务、数据库持久化、优雅退出、容器化交付。所有示例基于 Go 1.27 在本机实跑,关键结论以真实输出为准。
本页是《Go 语言编程入门》的全书目录:按章节顺序列出全部 61 篇,点击标题直达正文。也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇 里的三条学习路径与八周计划。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Go 语言编程入门》 |
| 篇数 | 61 篇(正文 18 章 54 节 + 目录篇 + 序 + 前言 + 附录 A–D) |
| 领域 | Go 语言从零到可交付服务 |
| 贯穿项目 | TaskAPI —— 一个任务管理 HTTP 服务,18 章逐步长大 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按查漏场景跳读 |
| 实测版本 | Go 1.27.0(本机 GOTOOLCHAIN=go1.27.0 实跑;官方最新 stable 为 1.27.2) |
| 依赖 | 正文只用标准库,不引入任何第三方依赖 |
| 上级专题 | 书稿专题 |
全书目录
前置
| 节 | 文章 | 核心内容 |
|---|---|---|
| — | 目录与学习路径 | 全书导航页:读者定位、三条学习路径与八周计划、六部分依赖关系与 54 节逐节索引 |
| — | 序 | 更高视角:Go 在 2026 年的生态定位、为什么值得系统学、常见误解与心智模型 |
| — | 前言 | 本书怎么来的、写给谁、六部分结构、版本与排版约定、本书不写什么 |
| 附 A | 附录 A.Go 语法与惯用法速查 | 类型、变量、控制流、函数与 defer、切片、map、字符串、结构体、接口、错误、泛型、并发 12 张表 + 可运行片段 |
| 附 B | 附录 B.标准库常用 API 速查 | strings / strconv / bytes / time / encoding/json / os / io / fmt / errors / slices / maps / cmp / sync / context / net/http / log/slog 等按「想做什么 → 用哪个函数」组织,签名经 go doc 逐条核实 |
| 附 C | 附录 C.go 命令与工具链速查 | go build/run/test/vet/fmt/mod/get/work/generate/doc/env、GOTOOLCHAIN 多版本、环境变量与构建标志、交叉编译 |
| 附 D | 附录 D.常见错误与 FAQ | 15 条报错与 FAQ:declared and not used、cannot use x as T、nil map 写入、切片别名、goroutine 泄漏、context deadline exceeded、missing go.sum entry、import cycle not allowed、中文按字节切片乱码……每条给最小复现 |
第一部分:起步(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 1.1 安装与工具链 | 多版本共存与 GOTOOLCHAIN 协商、go env 关键项、GOPROXY、gofmt 与 go vet 的位置 |
| 1.2 | 1.2 第一个程序与 go run/build | go run 与 go build 的差别、go version -m 读出构建信息、go install 落 GOBIN、os.Args 实测 |
| 1.3 | 1.3 Go Modules 与项目骨架 | go mod init 的产物、go list 系列、go mod tidy/verify/graph;实测只有标准库时不生成 go.sum |
| 2.1 | 2.1 变量、常量与基本类型 | 零值、短变量声明、iota、strconv.IntSize、float32/64 精度差、uint8 回绕、unsafe.Sizeof 宽度 |
| 2.2 | 2.2 控制流与循环 | if 初始化语句、三段式与 while 式 for、range、带标签 break、无表达式 switch、进程退出码 |
| 2.3 | 2.3 函数、多返回值与 defer | 多返回值与命名返回值、可变参数、defer 的 LIFO、defer 参数立即求值 vs 闭包延迟求值 |
| 3.1 | 3.1 数组、切片与扩容 | 数组的值语义、切片共享底层数组、append 扩容轨迹(cap 0→4→8→16)、三索引切片修复污染、copy、slices 泛型函数 |
| 3.2 | 3.2 map 与集合惯用法 | comma-ok、遍历顺序随机、不可寻址与不可比较键的编译错误原文、maps/slices 组合用法 |
| 3.3 | 3.3 字符串、rune 与字节 | len 与 RuneCountInString 的差、按字节切出非法 UTF-8、range 解码 rune 与偏移、strings.Builder、中文标题处理 |
第二部分:建模(第 4–6 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 4.1 结构体定义与初始化 | 字段名/位置/new 三种初始化、零值可用、可比较性、匿名结构体、内存对齐与值传参 vs 指针传参 |
| 4.2 | 4.2 方法与值/指针接收者 | 值接收者改副本、指针接收者改本体、map 元素不可寻址、方法值与方法表达式、nil 指针接收者的安全用法 |
| 4.3 | 4.3 组合与嵌入 | 字段与方法提升、指针嵌入、同层冲突 ambiguous、遮蔽规则、多级嵌入 |
| 5.1 | 5.1 接口定义与隐式实现 | 隐式实现、编译期断言 var _ I = (*T)(nil)、指针接收者与方法集、typed-nil 接口 == nil 为 false |
| 5.2 | 5.2 类型断言与 type switch | 单值/双值断言、nil 接口安全、断言到接口、type switch 的 case 顺序、%T 诊断 |
| 5.3 | 5.3 接口设计惯用法 | 接口嵌入、接口隔离(大接口拆小)、接受接口返回结构体、在调用方定义接口 |
| 6.1 | 6.1 error 接口与哨兵错误 | errors.New 哨兵、比较语义、switch err 分派、忽略错误的代价 |
| 6.2 | 6.2 fmt.Errorf 与 %w 包装 | %v 与 %w 文本相同但 errors.Is 结果相反、Unwrap 链、多 %w 与 errors.Join |
| 6.3 | 6.3 errors.Is/As 与自定义错误 | errors.Is 判根因、errors.As 取具体类型、自定义 Is 按状态码判断、As 匹配接口 |
第三部分:工程化(第 7–9 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 7.1 包的声明、导入与可见性 | 导出规则与命名、internal 边界(实测复现 use of internal package ... not allowed)、循环导入 |
| 7.2 | 7.2 go.mod/go.sum 与最小版本选择 | go mod edit 系列、最小版本选择(MVS)、go mod graph 与 why -m、GOPROXY 与本地 replace |
| 7.3 | 7.3 go get/tidy/vendor 与依赖治理 | go mod vendor 产物与 -mod=vendor、go mod verify、go work 多模块工作区 |
| 8.1 | 8.1 表驱动单元测试 | 表驱动结构与子测试 t.Run、-run 过滤、-short 跳过长用例 |
| 8.2 | 8.2 基准测试与覆盖率 | -benchmem 的 ns/op 与 allocs/op、-benchtime/-count、-coverprofile 与 go tool cover -func |
| 8.3 | 8.3 测试替身与接口 mock | 手写 fake 优于引入 mock 库、依赖接口而非具体类型、错误传播路径的测试 |
| 9.1 | 9.1 类型参数与约束 | 类型参数、约束接口、~ 近似类型、cmp.Ordered,签名经 go doc 核实 |
| 9.2 | 9.2 slices/maps/cmp 标准库 | slices.SortFunc/Contains/IndexFunc/Compact/DeleteFunc、maps.Keys/Clone/Equal、cmp.Or 的实战用法 |
| 9.3 | 9.3 泛型的取舍 | 何时该用泛型、何时接口更合适、泛型类型别名、约束过度与可读性代价 |
第四部分:并发(第 10–12 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 10.1 goroutine 与调度直觉 | goroutine 为何比线程轻、启动成本量级、循环变量捕获、NumGoroutine 与栈量测量 |
| 10.2 | 10.2 channel 与 select | 有缓冲 channel 的 len/cap、close 后的接收语义、向已关闭 channel 发送会 panic、nil channel 永久阻塞、select 多路 |
| 10.3 | 10.3 worker pool 与 pipeline | 固定 worker 数与无限制并发的耗时对比、pipeline 阶段串联、fan-out/fan-in |
| 11.1 | 11.1 Mutex/RWMutex 与 atomic | 并发写 map 的致命错误、RWMutex 保护存储、atomic.Int64 类型化封装与 CAS、go vet 传值告警 |
| 11.2 | 11.2 WaitGroup/Once/sync.Map | WaitGroup.Go、Once/OnceValue/OnceValues、sync.Map 与 RWMutex+map 的基准对比与选择依据 |
| 11.3 | 11.3 用 -race 发现竞态 | 真实 DATA RACE 报告逐行解读、退出码 66、-race -count 放大偶发竞态、加锁后的对照基准 |
| 12.1 | 12.1 context 的取消与传播 | 取消树与 Done 通道、批量任务返回已完成数、goroutine 泄漏计数、go vet 的 lostcancel |
| 12.2 | 12.2 超时、截止时间与 WithValue | DeadlineExceeded、deadline 继承、WithTimeoutCause + context.Cause、AfterFunc、WithoutCancel、key 类型选择 |
| 12.3 | 12.3 优雅退出与信号处理 | signal.Notify 与 NotifyContext、在途请求排空、退出码 0 与被信号杀死的 143 对比 |
第五部分:Web(第 13–15 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 13.1 | 13.1 Handler、ServeMux 与路由 | 方法感知路由与 r.PathValue、405/404 的自动行为、httptest 的两种用法 |
| 13.2 | 13.2 请求解析、JSON 与响应 | SetEscapeHTML 默认转义、Encoder 自动追加换行、DisallowUnknownFields、WriteHeader 二次调用被忽略 |
| 13.3 | 13.3 中间件与访问日志 | 用包装 ResponseWriter 记录状态码与字节数、requestID 经 context 传递、recover 中间件、中间件顺序导致的「panic 请求没有访问日志」效应 |
| 14.1 | 14.1 database/sql 与驱动 | sql.Open 惰性建连、连接池 Stats、Prepare 复用、用纯标准库实现 driver.Driver 演示全链路 |
| 14.2 | 14.2 SQL 增删改查与事务 | 用 RowsAffected 判存在、sql.ErrNoRows 翻译为领域错误、BeginTx + defer Rollback + Commit、只读事务 |
| 14.3 | 14.3 schema 迁移与 sqlc | //go:embed + fs.ReadDir 发现迁移文件、按版本排序、sqlc 生成代码的形态(本机未装 sqlc,文中已明确标注) |
| 15.1 | 15.1 配置加载(flag/env/文件) | flag / env / JSON 文件 / 默认值的四级合并、fs.Visit 区分「显式设置」与「默认值」、fail-fast 校验 |
| 15.2 | 15.2 依赖注入与项目分层 | 接口边界与适配器、service 依赖接口而非实现、composition root 手工装配 |
| 15.3 | 15.3 统一错误响应与输入校验 | 用 errors.Is/As 把领域错误映射为状态码、多字段校验结果收集、httptest 断言四种状态码 |
第六部分:交付(第 16–18 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 16.1 | 16.1 log/slog 结构化日志 | JSON/Text Handler、With/WithGroup、LogValuer、LevelVar 动态调级、ReplaceAttr 改写键 |
| 16.2 | 16.2 pprof 与 expvar 看运行时 | /debug/pprof/ 抓取与 go tool pprof -top、runtime/pprof 离线采样、expvar 暴露自定义变量 |
| 16.3 | 16.3 健康检查与指标端点 | /healthz 与 /readyz 的语义差别、按 Prometheus 文本格式暴露 /metrics |
| 17.1 | 17.1 交叉编译与静态构建 | GOOS/GOARCH 交叉编译、-trimpath -ldflags "-s -w -X" 注入版本、//go:embed、用 file 验证产物 |
| 17.2 | 17.2 多阶段 Docker 镜像 | golang:1.27-alpine 构建阶段 + 最小运行阶段、非 root(uid 10001)、镜像约 21.5 MB(本机 Docker 实跑) |
| 17.3 | 17.3 部署与优雅重启 | 收到 TERM 后排空在途请求的真实时序、systemd 单元与部署脚本(macOS 无法执行,文中已声明) |
| 18.1 | 18.1 需求梳理与架构设计 | 全卷复盘:需求与边界、分层与依赖方向、容量与取舍、哪些设计是被后续章节逼出来的 |
| 18.2 | 18.2 端到端实现 | 串起全卷的完整链路:go vet、go test -race -cover、完整 curl 链路(POST/PATCH/GET/DELETE/404/422)与全链路日志 |
| 18.3 | 18.3 测试、打包与上线 | go tool cover -func 逐函数覆盖率、release 脚本、shasum -a 256 校验、CI YAML 形态(未执行) |
怎么用这份索引
- 顺序通读:从第 1 章 1.1 开始,每一节末尾都有上一节 / 下一节的导航。若不确定从哪开始,先看目录篇的三条学习路径 。
- 按问题跳读:切片被意外修改看 3.1、接口判 nil 为 false 看 5.1、
errors.Is不生效看 6.2、internal包报错看 7.1、missing go.sum entry看 7.2、数据竞争看 11.3、请求超时没生效看 12.2、Ctrl-C 打断在途请求看 12.3、中间件顺序不对看 13.3、事务没回滚看 14.2、配置没生效看 15.1。附录 D 另有一张按报错原文索引的速查表。 - 只查 API:直接翻附录 B
与附录 C
,两者都是「想做什么 → 用哪个」的对照表,签名经
go doc逐条核实。 - 想动手:18 章全程只有 TaskAPI 一个项目,每一节都在它的真实代码上推进,可以边读边改。