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

 更新时间:2025年08月19日 09:37:01   作者:程序员爱钓鱼  
在开发 Web 应用时,分页查询 是非常常见的需求,在 Go 语言中,我们可以结合 GORM + Gin 框架,快速实现分页查询接口,下面我们来看看具体实现方法吧

在开发 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语言分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 1.22版本新特性前瞻

    Go 1.22版本新特性前瞻

    这篇文章主要为大家介绍了Go 1.22版本新特性前瞻,包含语言的变化,编译器、运行时与工具链等应用对比详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 使用Go解析.ini配置文件格式的操作教程

    使用Go解析.ini配置文件格式的操作教程

    使用 Go 语言解析一个 .ini 格式的配置文件,提取其中的键值对,并按 section 分类存储,本文将给大家介绍如何用 Go 语言解析常见的 .ini 配置文件格式,需要的朋友可以参考下
    2025-07-07
  • go语言实现并发网络爬虫的示例代码

    go语言实现并发网络爬虫的示例代码

    本文主要介绍了go语言实现并发网络爬虫的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 详解如何在Golang中监听多个channel

    详解如何在Golang中监听多个channel

    这篇文章主要为大家详细介绍了如何在Golang中实现监听多个channel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • Go语言const&iota的实现示例

    Go语言const&iota的实现示例

    本文主要介绍了Go语言const&iota的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • golang指数运算操作

    golang指数运算操作

    这篇文章主要介绍了golang指数运算操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 使用go实现简易比特币区块链公链功能

    使用go实现简易比特币区块链公链功能

    这篇文章主要介绍了使用go实现简易比特币区块链公链功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Golang Gob编码(gob包的使用详解)

    Golang Gob编码(gob包的使用详解)

    这篇文章主要介绍了Golang Gob编码(gob包的使用详解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • go-kit组件使用hystrix中间件的操作

    go-kit组件使用hystrix中间件的操作

    这篇文章主要介绍了go-kit组件使用hystrix中间件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言学习之context包的用法详解

    Go语言学习之context包的用法详解

    日常Go开发中,Context包是用的最多的一个了,几乎所有函数的第一个参数都是ctx,那么我们为什么要传递Context呢,Context又有哪些用法,底层实现是如何呢?相信你也一定会有探索的欲望,那么就跟着本篇文章,一起来学习吧
    2022-10-10

最新评论