Go 知识地图
Go 文档要按“语法简单、原理不简单”的方式补齐。Go 的变量、切片、map、接口、goroutine、channel、context 和错误处理都很常用,但如果只看表面语法,项目里很容易踩坑。
学习路线
mermaid
flowchart TD
A["环境和 Go Modules"] --> B["变量、常量和基础类型"]
B --> C["流程控制和函数"]
C --> D["数组、切片、map 和结构体"]
D --> E["接口、方法和组合"]
E --> F["goroutine、channel 和调度"]
F --> G["context、错误处理和测试"]
G --> H["Web API、项目结构和性能排查"]每个模块必须补什么
| 模块 | 必讲原理 | 必备 Demo |
|---|---|---|
| 环境配置 | GOROOT、GOPATH、Go Modules、代理、版本管理 | 创建 module、引入依赖 |
| 变量常量 | 短变量声明、零值、作用域、iota | 业务状态常量 |
| 数据类型 | 整数、浮点、字符串、rune、指针、数组、切片、map | 切片扩容、map 统计 |
| 流程控制 | if、for、switch、defer、panic、recover | defer 执行顺序 |
| 函数 | 多返回值、闭包、函数类型、方法 | 策略函数、错误返回 |
| 结构体接口 | 值接收者、指针接收者、接口动态类型 | 支付接口和实现 |
| 并发 | goroutine、channel、select、调度、内存模型 | 生产者消费者 |
| context | 取消、超时、值传递、请求链路 | HTTP 请求超时控制 |
| 错误处理 | error、errors.Is/As、wrap、哨兵错误 | 业务错误包装 |
| 测试 | testing、table test、benchmark、mock | 服务函数单测 |
| Web API | net/http、路由、中间件、JSON、参数校验 | 最小 REST API |
| 项目实践 | 分层、配置、日志、优雅关闭 | 可运行后端项目骨架 |
Go 原理重点
mermaid
flowchart TD
A["Go 程序"] --> B["编译成本地二进制"]
B --> C["goroutine 创建"]
C --> D["GMP 调度模型"]
D --> E["channel 通信"]
E --> F["context 控制取消和超时"]重点要讲清:
- 切片是结构体,包含指针、长度、容量。
append可能触发扩容,旧切片和新切片可能指向不同底层数组。- map 不是并发安全的,多 goroutine 写需要锁或
sync.Map。 - 接口值包含动态类型和动态值,nil 接口问题要单独讲。
- channel 不是队列万能替代品,要理解阻塞、关闭和 select。
- context 用来传递取消信号和截止时间,不要滥用它传业务参数。
商业场景要求
Go 文档 Demo 要优先覆盖:
| 场景 | 需要覆盖 |
|---|---|
| HTTP API | 路由、中间件、JSON、错误响应 |
| 并发任务 | worker pool、channel、context 取消 |
| 微服务客户端 | 超时、重试、日志、指标 |
| 命令行工具 | 参数解析、配置、退出码 |
| 性能排查 | benchmark、pprof、内存分配 |
面试闭环
Go 面试页要能回答:
- slice 和 array 区别。
- slice 扩容规则和共享底层数组问题。
- map 为什么不是并发安全。
- interface nil 坑。
- 值接收者和指针接收者区别。
- goroutine 泄漏如何发生。
- channel 关闭原则。
- select 如何工作。
- context 为什么重要。
- GMP 调度模型是什么。
本章小结
Go 文档要避免只停留在“语法简洁”。真正的重点是切片、map、接口、goroutine、channel、context、错误处理和工程结构。每个点都要有原理图、可运行 Demo 和商业场景。
