# golang **Repository Path**: ronvon/golang ## Basic Information - **Project Name**: golang - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-29 - **Last Updated**: 2026-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Go Web 开发学习教程 基于 Gin + GORM + MySQL 的实战教程,适合有后端开发经验的学习者。 ## 教程特色 - **真实场景**: 所有示例基于实际业务场景 - **循序渐进**: 从简单到复杂,逐步深入 - **对比学习**: 与 Node.js/Python 框架对比,快速理解 - **完整项目**: 每周包含综合练习项目 - **无需 SQL**: 直接使用 GORM 操作数据库 ## 技术栈 - Go 1.20+ - Gin Web 框架 - GORM ORM - MySQL 8.0+ ## 学习路线 - **第 1 周**: Go 基础语法 - **第 2 周**: Gin 框架 - **第 3 周**: GORM 和 MySQL 详细学习路线查看 [docs/学习路线.md](docs/学习路线.md) ## 第 1 周:Go 基础语法 | 天数 | 主题 | 文档 | | --- | --- | --- | | 第 1 天 | 环境安装和第一个程序 | [查看](docs/第01周/第01天-环境安装和第一个程序.md) | | 第 2 天 | 变量、类型和基本运算 | [查看](docs/第01周/第02天-变量类型和基本运算.md) | | 第 3 天 | 结构体和方法 | [查看](docs/第01周/第03天-结构体和方法.md) | | 第 4 天 | 切片和数组 | [查看](docs/第01周/第04天-切片和数组.md) | | 第 5 天 | Map 和指针 | [查看](docs/第01周/第05天-Map和指针.md) | | 第 6 天 | 错误处理和包管理 | [查看](docs/第01周/第06天-错误处理和包管理.md) | | 第 7 天 | 综合练习 - 命令行商品管理 | [查看](docs/第01周/第07天-综合练习-命令行商品管理.md) | ## 第 2 周:Gin 框架 | 天数 | 主题 | 文档 | | --- | --- | --- | | 第 8 天 | Gin 框架入门 | [查看](docs/第02周/第08天-Gin框架入门.md) | | 第 9 天 | 路由参数和查询参数 | [查看](docs/第02周/第09天-路由参数和查询参数.md) | | 第 10 天 | 请求体验证 | [查看](docs/第02周/第10天-请求体验证.md) | | 第 11 天 | 统一响应和错误处理 | [查看](docs/第02周/第11天-统一响应和错误处理.md) | | 第 12 天 | 中间件和日志 | [查看](docs/第02周/第12天-中间件和日志.md) | | 第 13 天 | 项目结构和代码组织 | [查看](docs/第02周/第13天-项目结构和代码组织.md) | | 第 14 天 | 综合练习 - 内存版商品管理系统 | [查看](docs/第02周/第14天-综合练习-内存版商品管理系统.md) | ## 第 3 周:GORM 和 MySQL | 天数 | 主题 | 文档 | | --- | --- | --- | | 第 15 天 | GORM 入门和数据库连接 | [查看](docs/第03周/第15天-GORM入门和数据库连接.md) | | 第 16 天 | GORM 查询和条件筛选 | [查看](docs/第03周/第16天-GORM查询和条件筛选.md) | | 第 17 天 | 分页和动态查询 | [查看](docs/第03周/第17天-GORM分页和动态查询.md) | | 第 18 天 | 一对多关联 | [查看](docs/第03周/第18天-GORM一对多关联.md) | | 第 19 天 | 多对多关联 | [查看](docs/第03周/第19天-GORM多对多关联.md) | | 第 20 天 | 事务和钩子 | [查看](docs/第03周/第20天-GORM事务和钩子.md) | | 第 21 天 | 综合练习 - 商品分类管理 | [查看](docs/第03周/第21天-综合练习-商品分类管理.md) | ## 环境要求 - Go 1.20+ - MySQL 8.0+ - VS Code(推荐) ## MySQL 配置 创建开发数据库: ```sql CREATE DATABASE go_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` GORM 会自动创建表结构,无需手动建表。 ## 学习建议 1. **动手实践**: 每天完成代码练习 2. **理解原理**: 不只是复制代码 3. **对比学习**: 对照 Node.js/Python 理解差异 4. **完成项目**: 认真完成每周综合练习 ## 参考资源 - [Go 官方文档](https://go.dev/doc/) - [Gin 文档](https://gin-gonic.com/docs/) - [GORM 文档](https://gorm.io/docs/) --- ## 旧教程(待整理) 以下是原有的 30 天教程索引,待整理合并: ### Day 8:模块和包管理 - 目标:掌握 Go 项目的基本组织方式。 - 学习内容:`go mod init`、`go mod tidy`、module、package、import;大小写控制导出。 - Node.js 对照:`go.mod` 对应 `package.json` 的依赖描述部分。 - 编码练习:把字符串处理函数拆到独立 package。 - 扩展练习:创建 `internal` 目录,观察外部包是否能导入。 - 交付物:一个有 module 和多个 package 的项目。 - 复盘问题:Go 中函数名首字母大小写代表什么。 ### Day 9:指针 - 目标:理解 Go 的值传递和指针修改。 - 学习内容:`&`、`*`;指针零值;函数参数传递;结构体指针。 - Node.js 对照:JavaScript 对 object 传引用效果明显;Go 需要明确使用指针表达修改意图。 - 编码练习:编写更新 User 昵称和邮箱的函数。 - 扩展练习:比较值接收者和指针接收者对结构体修改的差异。 - 交付物:一个指针行为演示程序。 - 复盘问题:指针能否做算术运算;Go 为什么限制它。 ### Day 10:接口 - 目标:掌握 Go 的隐式接口实现。 - 学习内容:interface;方法集;多态;面向行为建模。 - Node.js 对照:TypeScript 需要声明实现关系,Go 只要方法匹配即可。 - 编码练习:定义 `Storage` 接口,实现 MemoryStorage。 - 扩展练习:实现 FileStorage,但可以先只写文件保存,不写完整读取。 - 交付物:一个可替换存储实现的 Todo 结构。 - 复盘问题:Go 接口应该由调用方定义还是实现方定义。 ### Day 11:错误处理进阶 - 目标:能写可判断、可包装的错误。 - 学习内容:`errors.New`、`fmt.Errorf`、`%w`、`errors.Is`、`errors.As`;自定义错误类型。 - Node.js 对照:Go 的错误链类似给 Error 增加 cause,但判断方式更明确。 - 编码练习:定义 `ErrTodoNotFound`,查询不存在时返回该错误。 - 扩展练习:创建带字段的业务错误类型,例如 Code 和 Message。 - 交付物:一个能区分错误类型的 Todo 查询函数。 - 复盘问题:什么时候返回哨兵错误;什么时候返回自定义错误类型。 ### Day 12:标准库 I/O 和文件处理 - 目标:掌握文件读写和路径处理。 - 学习内容:`os`、`io`、`bufio`、`path/filepath`;文件权限;逐行读取。 - Node.js 对照:`fs.readFile` 对应 `os.ReadFile`;流式读取对应 `bufio.Scanner`。 - 编码练习:读取日志文件,筛选包含 `ERROR` 的行。 - 扩展练习:把筛选结果写入新文件。 - 交付物:一个日志过滤命令行工具。 - 复盘问题:一次性读取和逐行读取分别适合什么场景。 ### Day 13:测试 - 目标:能为 Go 函数编写单元测试。 - 学习内容:`testing` 包;`go test`;表驱动测试;测试命名;覆盖率。 - Node.js 对照:Go 标准库内置测试能力,不必须引入 Jest。 - 编码练习:为安全除法、单词统计、Todo 查询补测试。 - 扩展练习:使用 `go test -cover` 查看覆盖率。 - 交付物:至少 3 个测试函数。 - 复盘问题:表驱动测试为什么适合 Go。 ### Day 14:第 2 周项目:JSON 文件版 Todo CLI - 目标:给第 1 周 Todo CLI 增加持久化和测试。 - 学习内容:JSON 编码解码;接口抽象;错误处理;测试。 - 编码任务:把 Todo 保存到 JSON 文件,程序重启后仍能读取。 - 功能要求:新增、列表、完成、删除;存储层通过接口调用。 - 交付物:一个 JSON 文件版 Todo CLI,包含核心测试。 - 复盘问题:存储接口如何帮助后续切换到数据库。 ## 第 3 周:Gin、GORM、MySQL Todo API ### Day 15:Gin 服务启动和路由基础 - 目标:使用 Gin 启动 HTTP 服务。 - 学习内容:Gin engine、路由组、路径参数、query 参数、JSON 响应和健康检查。 - Node.js 对照:Express Router 对应 Gin RouterGroup。 - 编码练习:实现 `/healthz` 和 `/api/v1/todos` 占位路由。 - 交付物:一个可测试、可启动的 Gin 服务。 - 复盘问题:为什么路由注册和服务启动应分开。 ### Day 16:Gin JSON 绑定和 Todo 请求验证 - 目标:处理 Todo JSON 请求并验证字段。 - 学习内容:`ShouldBindJSON`、binding tag、请求 DTO、响应 DTO 和状态码。 - Node.js 对照:`express.json()` 与 zod 校验对应 Gin 绑定和验证。 - 编码练习:实现创建 Todo 请求解析和标题校验。 - 交付物:`POST /api/v1/todos` handler 及测试。 - 复盘问题:为什么请求 DTO 不应直接使用 GORM 模型。 ### Day 17:Gin 中间件、日志和统一错误响应 - 目标:统一请求日志、请求 ID、恢复和错误输出。 - 学习内容:Gin middleware、`c.Next()`、`c.Errors`、状态码和耗时。 - Node.js 对照:Express middleware 对应 Gin HandlerFunc。 - 编码练习:增加请求 ID、访问日志和恢复中间件。 - 交付物:稳定的成功和错误响应格式。 - 复盘问题:中间件顺序如何影响日志和恢复结果。 ### Day 18:Todo API 项目结构和依赖组装 - 目标:建立可维护的 Gin API 项目结构。 - 学习内容:`cmd/api`、`internal/config`、handler、service、repository 和构造函数。 - Node.js 对照:routes、services、repositories 对应 Go package 边界。 - 编码练习:组装 Gin router、Todo service 和 repository。 - 交付物:一个可编译的分层项目骨架。 - 复盘问题:依赖为什么应从入口向内组装。 ### Day 19:MySQL 和 GORM 基础 - 目标:使用 GORM 连接 MySQL。 - 学习内容:MySQL driver、DSN、GORM model、主键、时间字段、索引和查询。 - Node.js 对照:Sequelize 或 Prisma 对应 GORM,mysql2 连接池对应底层 `sql.DB`。 - 编码练习:创建 Todo 模型并完成新增和查询。 - 交付物:可访问 MySQL 的 GORM repository。 - 复盘问题:GORM 模型与领域模型是否必须相同。 ### Day 20:配置、连接池和数据库迁移 - 目标:集中管理服务和 MySQL 配置。 - 学习内容:环境变量、配置校验、DSN、连接池、`AutoMigrate` 和就绪检查。 - Node.js 对照:`process.env` 和 ORM 初始化对应 Go 配置结构体与数据库初始化函数。 - 编码练习:加载 MySQL 配置并设置连接池。 - 交付物:配置测试、数据库初始化和迁移入口。 - 复盘问题:为什么日志不能输出完整 DSN。 ### Day 21:Gin、GORM、MySQL Todo CRUD - 目标:完成 Todo API 主体。 - 学习内容:创建、分页列表、详情、局部更新、删除、错误映射和事务边界。 - 编码任务:完成 `/api/v1/todos` 全部 CRUD 接口。 - 功能要求:handler 不直接访问 GORM,service 不依赖 Gin,数据写入 MySQL。 - 交付物:可测试的 Gin + GORM + MySQL Todo API。 - 复盘问题:handler、service、repository 各自负责什么。 ## 第 4 周:并发、质量和容器部署 ### Day 22:Todo 批处理与 goroutine - 目标:使用有上限的 goroutine 完成 Todo 批处理。 - 学习内容:goroutine 生命周期、`WaitGroup`、并发上限和错误收集。 - 编码练习:实现批量完成 Todo。 - 交付物:可取消、有限并发的批处理函数。 - 复盘问题:为什么普通 CRUD handler 不需要额外启动 goroutine。 ### Day 23:channel 和有限 worker pool - 目标:使用固定 worker 数量处理 Todo 批量导入。 - 学习内容:任务 channel、结果 channel、单向 channel 和关闭责任。 - 编码练习:实现可取消的 Todo 导入 worker pool。 - 交付物:任务只处理一次且能正确结束的 worker pool。 - 复盘问题:为什么 results 只能在全部 worker 结束后关闭。 ### Day 24:select、超时和任务取消 - 目标:处理结果、超时和取消事件。 - 学习内容:`select`、`context.WithTimeout`、缓冲结果 channel 和 timer。 - 编码练习:为 Todo 批处理增加整体超时。 - 交付物:成功、超时和取消路径测试。 - 复盘问题:为什么超时后底层 GORM 仍需使用相同 context。 ### Day 25:context 传递和优雅关闭 - 目标:把请求取消传到 MySQL,并支持 SIGTERM 优雅关闭。 - 学习内容:请求 context、GORM `WithContext`、`http.Server` 和 `Shutdown`。 - 编码练习:完成 handler 到 repository 的 context 链路。 - 交付物:可在停止信号后完成进行中请求的 API。 - 复盘问题:为什么不能在 repository 中改用 `context.Background()`。 ### Day 26:并发安全、事务和 race 检测 - 目标:区分进程内锁和数据库并发控制。 - 学习内容:Mutex、race detector、GORM 事务、行锁和条件更新。 - 编码练习:处理 Todo 并发更新和内存统计竞争。 - 交付物:race 测试和事务实现。 - 复盘问题:为什么 Mutex 不能保护多个 API 实例共同访问的 MySQL 数据。 ### Day 27:结构化日志、验证和错误收口 - 目标:固定日志字段和 API 错误协议。 - 学习内容:`log/slog`、request ID、Gin 验证错误和领域错误映射。 - 编码练习:完成 JSON 日志和集中错误转换。 - 交付物:不泄露密码和数据库内部信息的日志与响应。 - 复盘问题:哪些错误属于客户端输入,哪些属于服务故障。 ### Day 28:Docker 构建和 MySQL 部署 - 目标:使用容器启动 API 和 MySQL。 - 学习内容:多阶段 Dockerfile、非 root 用户、Compose、健康检查和停止信号。 - 编码练习:构建镜像并启动完整环境。 - 交付物:Dockerfile、Compose 配置和容器验收记录。 - 复盘问题:为什么 API 容器连接 MySQL 时不能使用 localhost。 ### Day 29:完整测试和项目验收 - 目标:完成 Gin + GORM + MySQL Todo API 的质量检查。 - 学习内容:service 单元测试、Gin `httptest`、MySQL 集成测试和 race 检测。 - 编码任务:补齐 CRUD、验证、错误和数据库测试。 - 交付物:测试、构建、接口和容器验收全部通过的 Todo API。 - 复盘问题:当前项目还有哪些生产环境缺口。 ### Day 30:项目复盘和下一阶段路线 - 目标:用测试、接口和构建结果完成量化复盘。 - 学习内容:Gin、GORM、MySQL、测试、并发、context、日志和部署。 - 编码任务:整理 README、环境变量、接口和验收结果。 - 交付物:最终 Todo API、项目说明和下一阶段计划。 - 下一阶段:版本化迁移、性能分析、可观测性、gRPC、消息队列和 Kubernetes。 - 复盘问题:哪些结论有测试或运行结果支持。 ## 每周验收标准 - 第 1 周:完成基础 Todo CLI。 - 第 2 周:完成接口化、可测试的 JSON Todo CLI。 - 第 3 周:完成 Gin + GORM + MySQL Todo CRUD API。 - 第 4 周:完成并发控制、context、日志、测试和容器部署。 ## 最终项目功能 ### Todo API - 创建 Todo。 - 分页查看 Todo,可按完成状态筛选。 - 查看单个 Todo。 - 修改标题或完成状态。 - 删除 Todo。 - 使用 MySQL 持久化。 - 提供 `/healthz` 和 `/readyz`。 - 返回统一错误格式。 - 支持请求超时和优雅关闭。 ## Node.js 到 Go 对照表 | Node.js | Go | | --- | --- | | `npm init` | `go mod init` | | `npm install` | `go get` | | `package.json` | `go.mod` | | `node index.js` | `go run .` | | Express Router | Gin RouterGroup | | Express middleware | Gin middleware | | Sequelize / Prisma | GORM | | mysql2 pool | GORM 底层 `sql.DB` 连接池 | | Promise | goroutine 和 channel | | AbortController | `context.Context` | | throw error | 返回 `error` | | class | struct 和 method | | TypeScript interface | Go interface | | Jest / Supertest | `testing` / `httptest` | ## 每日复盘问题 - 今天新增了哪些 Go 概念。 - 它和 Node.js 中哪个概念相似或不同。 - handler、service 和 repository 的职责是否分离。 - 请求 context 是否传到 GORM。 - 错误响应是否隐藏数据库内部信息。 - 并发任务是否有数量、超时和取消边界。 - 今天的代码、测试和构建是否通过。