Go语言结合Gin框架快速实现分页查询接口

作者:

文章目录
  • 依赖库安装: go get -u gorm.io/gorm go get -u gorm.io/driver/mysql go get -u github.com/gin-gonic/gin 数据库使用 MySQL(也可换 SQLite、Postgres)。
  • 我们以 User 模型作为例子: package main import ( “github.com/gin-gonic/gin” “gorm.io/driver/mysql” “gorm.io/gorm” “log” “net/http” ) // User 用户模型 type User struct { ID uint `gorm:”primaryKey”` Name string `gorm:”size:100″` Email string `gorm:”unique”` Age int } var db *gorm.DB func initDB() { dsn := “root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local” var err error db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(“数据库连接失败:”, err) } // 自动迁移 _ = db.AutoMigrate(&User{}) }
  • 分页查询的核心就是 计算 offset 和 limit: page 当前页(从 1 开始) pageSize 每页数量 offset = (page – 1) * pageSize 代码实现: // 分页查询接口 func getUsers(c *gin.Context) { // 获取查询参数,默认 page=1, pageSize=10 page := c.DefaultQuery(“page”, “1”) pageSize := c.DefaultQuery(“pageSize”, “10”) var ( users []User total int64 ) // 转换为 int var p, ps int fmt.Sscanf(page, “%d”, &p) fmt.Sscanf(pageSize, “%d”, &ps) if p < 1 { p = 1 } if ps < 1 { ps = 10 } // 查询总数 db.Model(&User{}).Count(&total) // 分页查询 db.Offset((p – 1) * ps).Limit(ps).Find(&users) // 返回 JSON c.JSON(http.StatusOK, gin.H{ “page”: p, “pageSize”: ps, “total”: total, “data”: users, }) } 在 main() 中注册路由: func main() { initDB() r := gin.Default() r.GET(“/users”, getUsers) r.Run(“:8080”) }
  • 请求: curl “http://localhost:8080/users?page=2&pageSize=5” 返回: { “page”: 2, “pageSize”: 5, “total”: 23, “data”: [ {“ID”:6,”Name”:”Alice”,”Email”:”alice@test.com”,”Age”:22}, {“ID”:7,”Name”:”Bob”,”Email”:”bob@test.com”,”Age”:25}, {“ID”:8,”Name”:”Tom”,”Email”:”tom@test.com”,”Age”:20}, {“ID”:9,”Name”:”Jerry”,”Email”:”jerry@test.com”,”Age”:30}, {“ID”:10,”Name”:”Lucy”,”Email”:”lucy@test.com”,”Age”:19} ] }
  • 本案例实现了一个 分页查询接口: 支持动态 page 和 pageSize 参数 返回总数 total,便于前端计算总页数 返回当前页数据 优化点: 1. 封装通用分页函数,避免每个接口都重复写分页逻辑。 2. 加入排序功能,如 orderBy=age desc。 3. 加入搜索过滤,例如按用户名查询。 这样,我们就能快速实现一个完整的 分页 + 搜索 + 排序 的列表接口。 到此这篇关于Go语言结合Gin框架快速实现分页查询接口的文章就介绍到这了,更多相关Go语言分页查询内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: golang通过mysql语句实现分页查询 Golang如何用gorm实现分页的功能 GORM框架实现分页的示例代码 Golang使用gorm实现分页功能的示例代码
  • 目录
    • 一、环境准备
    • 二、定义用户模型
    • 三、实现分页查询接口
    • 四、接口调用效果
    • 五、总结与优化

    在开发 Web 应用时,分页查询 是非常常见的需求。比如文章列表、用户管理后台、商品展示页,都需要分页展示数据。

    在 Go 语言中,我们可以结合 GORM + Gin 框架,快速实现分页查询接口。本文将带你一步步实现一个 用户列表的分页接口

    依赖库安装:

    go get -u gorm.io/gorm
    go get -u gorm.io/driver/mysql
    go get -u github.com/gin-gonic/gin
    

    数据库使用 MySQL(也可换 SQLite、Postgres)。

    我们以 User 模型作为例子:

    package main
    
    import (
        "github.com/gin-gonic/gin"
        "gorm.io/driver/mysql"
        "gorm.io/gorm"
        "log"
        "net/http"
    )
    
    // User 用户模型
    type User struct {
        ID    uint   `gorm:"primaryKey"`
        Name  string `gorm:"size:100"`
        Email string `gorm:"unique"`
        Age   int
    }
    
    var db *gorm.DB
    
    func initDB() {
        dsn := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
        var err error
        db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            log.Fatal("数据库连接失败:", err)
        }
        // 自动迁移
        _ = db.AutoMigrate(&User{})
    }
    

    分页查询的核心就是 计算 offset 和 limit

    • page 当前页(从 1 开始)
    • pageSize 每页数量
    • offset = (page - 1) * pageSize

    代码实现:

    // 分页查询接口
    func getUsers(c *gin.Context) {
        // 获取查询参数,默认 page=1, pageSize=10
        page := c.DefaultQuery("page", "1")
        pageSize := c.DefaultQuery("pageSize", "10")
    
        var (
            users []User
            total int64
        )
    
        // 转换为 int
        var p, ps int
        fmt.Sscanf(page, "%d", &p)
        fmt.Sscanf(pageSize, "%d", &ps)
        if p < 1 {
            p = 1
        }
        if ps < 1 {
            ps = 10
        }
    
        // 查询总数
        db.Model(&User{}).Count(&total)
    
        // 分页查询
        db.Offset((p - 1) * ps).Limit(ps).Find(&users)
    
        // 返回 JSON
        c.JSON(http.StatusOK, gin.H{
            "page":     p,
            "pageSize": ps,
            "total":    total,
            "data":     users,
        })
    }
    

    在 main() 中注册路由:

    func main() {
        initDB()
    
        r := gin.Default()
        r.GET("/users", getUsers)
    
        r.Run(":8080")
    }
    

    请求:

    curl "http://localhost:8080/users?page=2&pageSize=5"
    

    返回:

    {
      "page": 2,
      "pageSize": 5,
      "total": 23,
      "data": [
        {"ID":6,"Name":"Alice","Email":"alice@test.com","Age":22},
        {"ID":7,"Name":"Bob","Email":"bob@test.com","Age":25},
        {"ID":8,"Name":"Tom","Email":"tom@test.com","Age":20},
        {"ID":9,"Name":"Jerry","Email":"jerry@test.com","Age":30},
        {"ID":10,"Name":"Lucy","Email":"lucy@test.com","Age":19}
      ]
    }
    

    本案例实现了一个 分页查询接口

    • 支持动态 page 和 pageSize 参数
    • 返回总数 total,便于前端计算总页数
    • 返回当前页数据

    优化点:

    1. 封装通用分页函数,避免每个接口都重复写分页逻辑。

    2. 加入排序功能,如 orderBy=age desc

    3. 加入搜索过滤,例如按用户名查询。

    这样,我们就能快速实现一个完整的 分页 + 搜索 + 排序 的列表接口。

    到此这篇关于Go语言结合Gin框架快速实现分页查询接口的文章就介绍到这了,更多相关Go语言分页查询内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • golang通过mysql语句实现分页查询
    • Golang如何用gorm实现分页的功能
    • GORM框架实现分页的示例代码
    • Golang使用gorm实现分页功能的示例代码

    站内搜索