新闻中心
Golang如何实现基础的分页与排序功能_Golang分页排序项目实战
答案:通过定义包含页码、每页数量和排序规则的结构体,结合GORM实现分页查询与安全排序。设置默认值并校验参数,防止SQL注入,最后在Gin框架中绑定查询参数并返回带分页信息的响应,实现安全高效的列表数据展示功能。

在实际的 Web 服务开发中,分页与排序是数据展示最常见的需求。Golang 作为后端语言,在处理数据库查询时可以通过结构体、参数解析和 SQL 拼接来实现灵活的分页排序功能。下面以一个简单的用户列表接口为例,演示如何用 Golang 实现基础的分页与排序。
定义请求参数结构体
前端通常通过 URL 查询参数传递分页和排序信息,例如:/users?page=1&size=10&sort=name,asc。我们可以定义一个结构体来接收这些参数:
type Pagination struct {
Page int `json:"page" form:&q
uot;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
自定义设置的程度更高可以满足大部分中小型企业的建站需求,同时修正了上一版中发现的BUG,优化了核心的代码占用的服务器资源更少,执行速度比上一版更快 主要的特色功能如下: 1)特色的菜单设置功能,菜单设置分为顶部菜单和底部菜单,每一项都可以进行更名、选择是否隐 藏,排序等。 2)增加企业基本信息设置功能,输入的企业信息可以在网页底部的醒目位置看到。 3)增加了在线编辑功能,输入产品信息,企业介绍等栏
0
查看详情
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最新入口 官方网站地址及浏览器下载指南
不同用户不同价格! 索尼开启账户个性化定价测试


2025-11-12
浏览次数:次
返回列表
uot;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>