使用 gin 框架实现 rest api CRUD:定义 User 结构体与内存存储,注册 GET/POST/PUT/delete 路由,校验请求、处理状态码,启用日志与 Recovery 中间件提升健壮性。

用 golang 开发 REST API 实现增删改查(CRUD),核心是选对 Web 框架、设计清晰的路由、定义好数据结构,并把业务逻辑与 http 处理分离。推荐使用轻量但足够灵活的 net/http 或更易上手的 gin(本文以 gin 为例,兼顾简洁与实用性)。
准备环境与依赖
确保已安装 Go(建议 1.20+),然后初始化模块并引入 gin:
- 执行 go mod init myapi 初始化模块
- 运行 go get -u github.com/gin-gonic/gin
- 创建 main.go,导入 “github.com/gin-gonic/gin”
定义数据模型与存储
先定义一个简单的用户结构体,用内存切片模拟数据库(便于演示,后续可替换为 sql 或 redis):
type User struct { ID int `json:"id"` Name string `json:"name"` Age int `json:"age"` } var users = []User{ {ID: 1, Name: "张三", Age: 25}, {ID: 2, Name: "李四", Age: 30}, } var nextID = 3
注意:真实项目中应使用结构体标签(如 json:”name”)控制序列化,避免字段名大小写导致前端接收异常。
立即学习“go语言免费学习笔记(深入)”;
实现 CRUD 路由与处理函数
在 gin.Engine 上注册标准 REST 路由,每个方法对应一种操作:
- GET /users:返回全部用户列表,状态码 200
- GET /users/:id:根据路径参数 id 查单个用户,找不到返回 404
- POST /users:解析 JSON 请求体,校验必填字段(如 Name),生成新用户并返回 201
- PUT /users/:id:查找原用户,更新字段(建议只更新传入字段,非全量覆盖),返回 200 或 404
- DELETE /users/:id:按 id 删除,成功返回 204,未找到返回 404
示例 POST 处理逻辑:
func createUser(c *gin.Context) { var newUser User if err := c.ShouldBindJSON(&newUser); err != nil { c.JSON(400, gin.H{"error": "无效的 JSON"}) return } if newUser.Name == "" { c.JSON(400, gin.H{"error": "姓名不能为空"}) return } newUser.ID = nextID nextID++ users = append(users, newUser) c.JSON(201, newUser) }
启动服务与基础优化
调用 router.Run(“:8080”) 启动服务,默认监听本地 8080 端口。上线前建议补充:
- 添加日志中间件(router.Use(gin.Logger()))观察请求流
- 启用 Recovery 中间件防止 panic 导致服务崩溃
- 对所有响应统一加 Content-Type: application/json(gin 默认已做)
- 用 c.AbortWithStatusJSON() 快速返回错误响应,保持风格一致
不复杂但容易忽略:所有 ID 参数需转为整型并校验是否 > 0;更新和删除前务必检查资源是否存在,避免静默失败。