Go语言实战案例-实现分页查询接口

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

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


一、环境准备

依赖库安装:

arduino 复制代码
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 模型作为例子:

go 复制代码
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

代码实现:

go 复制代码
// 分页查询接口
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() 中注册路由:

scss 复制代码
func main() {
    initDB()

    r := gin.Default()
    r.GET("/users", getUsers)

    r.Run(":8080")
}

四、接口调用效果

请求:

arduino 复制代码
curl "http://localhost:8080/users?page=2&pageSize=5"

返回:

perl 复制代码
{
  "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}
  ]
}

五、总结与优化

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

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

🔧 优化点:

    1. 封装通用分页函数,避免每个接口都重复写分页逻辑。
    1. 加入排序功能 ,如 orderBy=age desc
    1. 加入搜索过滤,例如按用户名查询。

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

相关推荐
码兄科技4 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
腾讯云云开发5 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
后端
星栈5 小时前
从装一堆工具到看懂 Node 工程化思维:我的项目复盘记录
后端·node.js
65岁退休Coder6 小时前
LangChain v1.3.4 笔记 - 05 Agent 上下文记忆
后端
颜酱6 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
JaneConan6 小时前
鸿蒙 韶非 UI 系列:能力调用 startAbilityForResult,跳能力拿回参,鸿蒙能力路由入门
后端·harmonyos
晴空了无痕6 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
用户8356290780516 小时前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python
花椒技术6 小时前
原本要 2 天的服务端冒烟前置审查,为什么 3 分半就能出报告?|QA 质量交付实践(三)
后端·ai编程·测试
达达尼昂6 小时前
AI 编程的工程化实践:Flutter AI Harness 的设计与落地
人工智能·后端·全栈