字
字节笔记本
2026年3月22日
7天用Go从零实现系列项目
本文介绍 7days-golang,一个由 geektutu 维护的 Go 语言从零实现系列教程。该项目在 GitHub 上已获得 16.6k stars,通过 7 天时间分别实现了 Web 框架 Gee、分布式缓存 GeeCache、ORM 框架 GeeORM 和 RPC 框架 GeeRPC 四个核心项目,是学习 Go 语言底层原理的优秀实践教程。
项目简介
7days-golang 是一个 Go 语言进阶学习项目,旨在通过从零实现常见基础设施组件,帮助开发者深入理解 Go 语言的特性和后端系统的核心设计。项目使用纯 Go 编写(99.1%),采用 MIT 开源协议,目前已有 2.6k forks。
项目包含四个独立的子项目,每个项目都通过 7 天的渐进式开发完成,从基础概念到完整实现,适合有一定 Go 语言基础的开发者进阶学习。
四大子项目
1. Gee — Web 框架
Gee 是一个模仿 gin 实现的 Web 框架,覆盖了 Web 框架的核心设计要素:
| 天数 | 主题 | 核心内容 |
|---|---|---|
| Day 1 | 前置知识 | http.Handler 接口 |
| Day 2 | 上下文设计 | Context 封装 |
| Day 3 | Trie 树路由 | 高效路由匹配 |
| Day 4 | 分组控制 | 路由分组 |
| Day 5 | 中间件 | 中间件机制 |
| Day 6 | HTML 模板 | 模板渲染 |
| Day 7 | 错误恢复 | Panic Recover |
核心亮点:
- 基于 Trie 树实现高效路由匹配,支持动态参数
- 灵活的中间件机制,支持全局和分组级别中间件
- 完善的分组控制,类似 gin 的 Group 用法
2. GeeCache — 分布式缓存
GeeCache 是一个模仿 groupcache 实现的分布式缓存系统,涵盖分布式系统的核心问题:
| 天数 | 主题 | 核心内容 |
|---|---|---|
| Day 1 | LRU 缓存 | 缓存淘汰策略 |
| Day 2 | 单机并发缓存 | 并发安全 |
| Day 3 | HTTP 服务端 | 网络通信 |
| Day 4 | 一致性哈希 | 节点分片 |
| Day 5 | 分布式节点 | 节点通信 |
| Day 6 | 防止缓存击穿 | singleflight |
| Day 7 | Protobuf | 高效序列化 |
核心亮点:
- 使用一致性哈希算法解决节点分片问题
- singleflight 防止缓存击穿
- Protobuf 作为节点间通信协议
3. GeeORM — ORM 框架
GeeORM 是一个参考 gorm 和 xorm 设计的 ORM 框架:
| 天数 | 主题 | 核心内容 |
|---|---|---|
| Day 1 | database/sql | 基础接口 |
| Day 2 | 对象表结构映射 | Schema 映射 |
| Day 3 | 记录新增和查询 | CRUD 基础 |
| Day 4 | 链式操作 | 链式调用 |
| Day 5 | 钩子 Hooks | 生命周期回调 |
| Day 6 | 事务支持 | Transaction |
| Day 7 | 数据库迁移 | Migrate |
核心亮点:
- 结构体标签自动映射表结构
- 支持链式查询、更新、删除
- 钩子机制支持 BeforeInsert/AfterInsert 等回调
- 内置数据库迁移功能
4. GeeRPC — RPC 框架
GeeRPC 是基于 net/rpc 扩展的 RPC 框架,代码约 1000 行:
| 天数 | 主题 | 核心内容 |
|---|---|---|
| Day 1 | 消息编解码 | 协议设计 |
| Day 2 | 并发客户端 | 异步调用 |
| Day 3 | 服务注册 | Service Register |
| Day 4 | 超时处理 | Timeout |
| Day 5 | HTTP 协议 | 多协议支持 |
| Day 6 | 负载均衡 | Load Balance |
| Day 7 | 服务发现 | Registry |
核心亮点:
- 自定义消息编解码协议
- 支持并发和异步的客户端调用
- 内置服务注册与发现机制
- 支持多种负载均衡策略
技术栈
- Go — 主要开发语言,利用 goroutine、channel、interface 等特性
- net/http — HTTP 服务端实现
- database/sql — 数据库操作抽象
- net/rpc — RPC 基础设施
- encoding/json / protobuf — 序列化协议
- sync — 并发原语(Mutex、RWMutex、WaitGroup)
快速开始
bash
# 克隆仓库
git clone https://github.com/geektutu/7days-golang.git
# 进入子项目目录,例如 Gee Web 框架
cd 7days-golang/gee-web
# 按 day 顺序阅读和运行代码
# 每个 day 对应一个独立的代码目录适用人群
| 人群 | 适用程度 |
|---|---|
| Go 初学者 | 需要先学习 Go 基础语法 |
| 有一定基础的开发者 | 非常适合,通过实践深入理解 |
| 想了解框架原理的开发者 | 最佳选择,代码简洁清晰 |
| 准备面试的开发者 | 适合,涵盖常见面试知识点 |
学习建议
- 按顺序学习:每个子项目从 Day 1 开始,循序渐进
- 动手实践:不要只看代码,跟着教程一步步实现
- 对比源码:将 Gee 与 gin、GeeCache 与 groupcache 对比学习
- 深入思考:每篇文章末尾有思考题,建议认真完成
项目链接
- GitHub 仓库:https://github.com/geektutu/7days-golang
- 项目主页:https://geektutu.com/post/gee.html
- 开源协议:MIT License
分享: