Go语言实战案例:用Gin实现图书管理接口

在 Web API 开发中,最常见的场景之一就是构建 增删改查(CRUD) 接口。

本篇我们将用 Gin 框架 来实现一个简单的图书管理系统 API,数据会存储在内存中(方便演示),但结构设计可方便以后替换为数据库。


一、功能目标

我们要实现以下接口:

    1. 获取所有图书 GET /books
    1. 根据ID获取图书 GET /books/:id
    1. 添加图书 POST /books
    1. 更新图书 PUT /books/:id
    1. 删除图书 DELETE /books/:id

二、项目初始化

确保你已安装 Go 1.18+ 和 Gin:

arduino 复制代码
go get -u github.com/gin-gonic/gin

三、代码实现

go 复制代码
package main

import (
    "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 Book
    if err := c.ShouldBindJSON(&newBook); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    // 模拟自增ID
    newBook.ID = len(books) + 1
    books = append(books, newBook)

    c.JSON(http.StatusCreated, newBook)
}

// 更新图书
func updateBook(c *gin.Context) {
    idStr := c.Param("id")
    id, _ := strconv.Atoi(idStr)

    var updateData Book
    if 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.Title
            books[i].Author = updateData.Author
            c.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 复制代码
go run main.go

1. 获取所有图书

bash 复制代码
curl http://localhost:8080/books

2. 获取单本图书

bash 复制代码
curl http://localhost:8080/books/1

3. 添加图书

json 复制代码
curl -X POST http://localhost:8080/books \
  -H "Content-Type: application/json" \
  -d '{"title":"Go Web编程","author":"王五"}'

4. 更新图书

json 复制代码
curl -X PUT http://localhost:8080/books/1 \
  -H "Content-Type: application/json" \
  -d '{"title":"Go语言进阶","author":"张三改"}'

5. 删除图书

bash 复制代码
curl -X DELETE http://localhost:8080/books/2

五、总结

  • • 使用 Gin 可以非常轻松地构建 RESTful API
  • • 路由映射到不同的处理函数
  • • JSON 参数解析只需 ShouldBindJSON
  • • 后续可以把 books 切片替换为数据库(MySQL、PostgreSQL、MongoDB等)

相关推荐
crossoverJie几秒前
在多语言的分布式系统中如何传递 Trace 信息
分布式·后端·开源
用户848508146906 分钟前
SurrealDB 快速上手教程
数据库·后端
用户61474934277429 分钟前
JeecgBoot 项目理解与使用心得
后端
郭京京44 分钟前
go常用包json
go
ZIQ1 小时前
单机线程池任务防丢设计与实现思路
后端
MaxHua1 小时前
我用 Java 飞算 AI 快速开发了一个音频转文字工具
后端
欧阳码农1 小时前
langgraph开发Deep Research智能体-项目搭建
前端·后端·langchain
BigYe程普1 小时前
出海技术栈集成教程(二):Supabase 登录与数据库配置
前端·后端·全栈
臻实1 小时前
Win10系统Ruby+Devkit3.4.5-1安装
开发语言·后端·ruby
汪子熙1 小时前
使用 Python 解析 X.509 格式的公钥证书
后端