Go语言实战案例:用Gin实现图书管理接口
在 Web API 开发中,最常见的场景之一就是构建 增删改查(CRUD) 接口。
本篇我们将用 Gin 框架 来实现一个简单的图书管理系统 API,数据会存储在内存中(方便演示),但结构设计可方便以后替换为数据库。
一、功能目标
我们要实现以下接口:
- 1. 获取所有图书
GET /books
- 2. 根据ID获取图书
GET /books/:id
- 3. 添加图书
POST /books
- 4. 更新图书
PUT /books/:id
- 5. 删除图书
DELETE /books/:id
二、项目初始化
确保你已安装 Go 1.18+ 和 Gin:
go get -u github.com/gin-gonic/gin
三、代码实现
package mainimport ("github.com/gin-gonic/gin""net/http""strconv"
)// 图书结构体
type Book struct {ID int `json:"id"`Title string `json:"title"`Author string `json:"author"`
}var books = []Book{{ID: 1, Title: "Go语言实战", Author: "张三"},{ID: 2, Title: "Gin框架入门", Author: "李四"},
}// 获取所有图书
func getBooks(c *gin.Context) {c.JSON(http.StatusOK, books)
}// 根据ID获取图书
func getBookByID(c *gin.Context) {idStr := c.Param("id")id, _ := strconv.Atoi(idStr)for _, book := range books {if book.ID == id {c.JSON(http.StatusOK, book)return}}c.JSON(http.StatusNotFound, gin.H{"error": "图书不存在"})
}// 添加图书
func addBook(c *gin.Context) {var newBook Bookif err := c.ShouldBindJSON(&newBook); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 模拟自增IDnewBook.ID = len(books) + 1books = append(books, newBook)c.JSON(http.StatusCreated, newBook)
}// 更新图书
func updateBook(c *gin.Context) {idStr := c.Param("id")id, _ := strconv.Atoi(idStr)var updateData Bookif err := c.ShouldBindJSON(&updateData); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}for i, book := range books {if book.ID == id {books[i].Title = updateData.Titlebooks[i].Author = updateData.Authorc.JSON(http.StatusOK, books[i])return}}c.JSON(http.StatusNotFound, gin.H{"error": "图书不存在"})
}// 删除图书
func deleteBook(c *gin.Context) {idStr := c.Param("id")id, _ := strconv.Atoi(idStr)for i, book := range books {if book.ID == id {books = append(books[:i], books[i+1:]...)c.JSON(http.StatusOK, gin.H{"message": "删除成功"})return}}c.JSON(http.StatusNotFound, gin.H{"error": "图书不存在"})
}func main() {r := gin.Default()r.GET("/books", getBooks)r.GET("/books/:id", getBookByID)r.POST("/books", addBook)r.PUT("/books/:id", updateBook)r.DELETE("/books/:id", deleteBook)r.Run(":8080")
}
四、运行与测试
运行服务:
go run main.go
1. 获取所有图书
curl http://localhost:8080/books
2. 获取单本图书
curl http://localhost:8080/books/1
3. 添加图书
curl -X POST http://localhost:8080/books \-H "Content-Type: application/json" \-d '{"title":"Go Web编程","author":"王五"}'
4. 更新图书
curl -X PUT http://localhost:8080/books/1 \-H "Content-Type: application/json" \-d '{"title":"Go语言进阶","author":"张三改"}'
5. 删除图书
curl -X DELETE http://localhost:8080/books/2
五、总结
- • 使用 Gin 可以非常轻松地构建 RESTful API
- • 路由映射到不同的处理函数
- • JSON 参数解析只需
ShouldBindJSON
- • 后续可以把
books
切片替换为数据库(MySQL、PostgreSQL、MongoDB等)