新闻中心

Golang如何实现基础的分页与排序功能_Golang分页排序项目实战

2025-11-12
浏览次数:
返回列表
答案:通过定义包含页码、每页数量和排序规则的结构体,结合GORM实现分页查询与安全排序。设置默认值并校验参数,防止SQL注入,最后在Gin框架中绑定查询参数并返回带分页信息的响应,实现安全高效的列表数据展示功能。

golang如何实现基础的分页与排序功能_golang分页排序项目实战

在实际的 Web 服务开发中,分页与排序是数据展示最常见的需求。Golang 作为后端语言,在处理数据库查询时可以通过结构体、参数解析和 SQL 拼接来实现灵活的分页排序功能。下面以一个简单的用户列表接口为例,演示如何用 Golang 实现基础的分页与排序。

定义请求参数结构体

前端通常通过 URL 查询参数传递分页和排序信息,例如:/users?page=1&size=10&sort=name,asc。我们可以定义一个结构体来接收这些参数:

type Pagination struct {
    Page   int    `json:"page" form:"page"`
    Size   int    `json:"size" form:"size"`
    Sort   string `json:"sort" form:"sort"` // 格式:字段名,方向(如 name,asc)
}
<p>func (p *Pagination) setDefault() {
if p.Page < 1 {
p.Page = 1
}
if p.Size < 1 || p.Size > 100 {
p.Size = 10 // 默认每页10条,上限100
}
if p.Sort == "" {
p.Sort = "id,desc" // 默认按ID降序
}
}</p>

构建数据库查询语句

使用 GORM 或原生 SQL 都可以动态拼接 LIMIT、OFFSET 和 ORDER BY 子句。以下以 GORM 为例说明:

func GetUsers(db *gorm.DB, pagination Pagination) ([]User, int64, error) {
    var users []User
    var total int64
<pre class='brush:php;toolbar:false;'>// 设置默认值
pagination.setDefault()

// 获取总数
db.Model(&User{}).Count(&total)

// 解析排序字段
sortField, sortDir := "id", "desc"
if parts := strings.Split(pagination.Sort, ","); len(parts) == 2 {
    field, dir := parts[0], parts[1]
    if isValidField(field) {   // 防止SQL注入,校验字段合法性
        sortField = field
    }
    if dir == "asc" || dir == "desc" {
        sortDir = dir
    }
}

// 执行分页查询
offset := (pagination.Page - 1) * pagination.Size
result := db.Order(sortField + " " + sortDir).
          Limit(pagination.Size).
          Offset(offset).
          Find(&users)

return users, total, result.Error

}

注意:务必对 sort 字段进行白名单校验(如 isValidField 函数),防止恶意排序导致 SQL 注入或性能问题。

在 HTTP 接口中使用分页排序

结合 Gin 框架,可以轻松将上述逻辑集成到路由处理函数中:

视野自助系统小型企业版2.0 Build 20050310 视野自助系统小型企业版2.0 Build 20050310

自定义设置的程度更高可以满足大部分中小型企业的建站需求,同时修正了上一版中发现的BUG,优化了核心的代码占用的服务器资源更少,执行速度比上一版更快 主要的特色功能如下: 1)特色的菜单设置功能,菜单设置分为顶部菜单和底部菜单,每一项都可以进行更名、选择是否隐 藏,排序等。 2)增加企业基本信息设置功能,输入的企业信息可以在网页底部的醒目位置看到。 3)增加了在线编辑功能,输入产品信息,企业介绍等栏

视野自助系统小型企业版2.0 Build 20050310 0 查看详情 视野自助系统小型企业版2.0 Build 20050310
func GetUserList(c *gin.Context) {
    var pagination Pagination
    if err := c.ShouldBindQuery(&pagination); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
<pre class='brush:php;toolbar:false;'>users, total, err := GetUsers(c.MustGet("db").(*gorm.DB), pagination)
if err != nil {
    c.JSON(500, gin.H{"error": "查询失败"})
    return
}

c.JSON(200, gin.H{
    "data": users,
    "pagination": gin.H{
        "page":   pagination.Page,
        "size":   pagination.Size,
        "total":  total,
        "pages":  (total + int64(pagination.Size) - 1) / int64(pagination.Size),
    },
})

}

这样前端就能收到包含分页元信息的标准响应,便于渲染分页控件。

总结与建议

实现分页排序的关键点在于:

  • 统一参数结构,便于复用和验证
  • 限制每页数量,避免数据库压力过大
  • 对排序字段做白名单控制,提升安全性
  • 返回总条数和页码信息,支持前端完整分页逻辑

基本上就这些。不复杂但容易忽略细节,比如默认值设置和边界检查。只要把这些封装好,后续任何列表接口都可以快速接入。

以上就是Golang如何实现基础的分页与排序功能_Golang分页排序项目实战的详细内容,更多请关注其它相关文章!


# 前端  # json  # js  # 抖音哪里查关键词排名的  # 网站新的优化怎么做好呢  # 海南seo优化怎么样  # 新人怎么学SEO  # 遂宁建设网站报价  # 优化收录网站  # 网站推广seo代运营  # 白山关键词排名优化打造  # 短信群发营销宣传推广  # 在线替换关键词网站排名  # 数据库查询  # 资源管理  # 为例  # 上一  # 默认值  # 如何实现  # 每页  # 加载  # 分页  # 防止sql注入  # gin框架  # sql注入  # 路由  # 后端  # golang  # go 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  Python大型XML文件高效流式解析教程  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  网易大神账号申诉需要多久_网易大神账号申诉流程说明  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  Mac怎么查看崩溃日志_Mac控制台错误报告分析  大象笔记网页版入口 印象笔记网页版登录入口  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  126邮箱账号注册 电脑版登录入口  Python多版本共存与虚拟环境管理深度指南  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  抖音从哪里进入网页版_抖音官方入口链接  新三国志曹操传110级星符试炼夏侯渊极难攻略  Mac怎么使用表情符号_Mac Emoji快捷键面板  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Lar*el Excel导入时生成自定义递增ID的策略与实践  解决Flask中Quill编辑器内容提交失败及TypeError的指南  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  精准捕获:如何在页面中监听除特定元素外的所有点击事件  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  React中useState与局部变量:理解组件状态管理与渲染机制  qq游戏网页版直接玩_qq游戏免下载快速入口  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  谷歌推RCS信息存档功能:公司可监控员工私密信息!  电脑IP地址怎么查 查看本机IP地址的几种方法  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  Go Martini框架:动态服务解码后的图片内容  快手官方唯一登录入口 谨防山寨钓鱼网站  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  Django模型中自动计算可用余额的实现方法  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  AO3访问入口汇总 AO3网页版同人作品一键直达  FullCalendar 自定义按钮样式定制指南  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  不同用户不同价格! 索尼开启账户个性化定价测试 

搜索