首页 > 后端开发 > Golang > 正文

如何在Golang中实现基础的分页查询功能_Golang分页查询项目实战汇总

P粉602998670
发布: 2025-11-07 02:03:24
原创
669人浏览过
分页查询通过定义Pagination结构体接收页码和每页数量,利用GetOffset和GetLimit方法计算SQL的OFFSET和LIMIT值,结合数据库查询获取数据列表与总记录数,再通过PaginatedResult封装包含数据、总数、当前页等信息的响应结果,最后在Gin框架中绑定请求参数并返回分页数据,实现高效、可复用的分页功能。

如何在golang中实现基础的分页查询功能_golang分页查询项目实战汇总

在Go语言开发中,分页查询是处理数据库大量数据时最常见的需求之一。无论是后台管理系统、API接口还是Web应用,都需要将数据分批次展示,避免一次性加载过多内容导致性能下降。下面介绍如何在Golang中实现一个基础但实用的分页查询功能。

1. 定义分页参数结构体

为了统一管理分页请求的数据,通常会定义一个结构体来接收前端传入的分页信息:

type Pagination struct {
    Page     int `json:"page" form:"page"`         // 当前页码
    PageSize int `json:"page_size" form:"page_size"` // 每页数量
}
<p>func (p <em>Pagination) GetOffset() int {
return (p.Page - 1) </em> p.PageSize
}</p><p>func (p *Pagination) GetLimit() int {
return p.PageSize
}</p>
登录后复制

这里使用了form标签,方便与Gin等Web框架结合解析URL参数或JSON请求体。GetOffset和GetLimit方法用于生成SQL查询中的LIMIT和OFFSET值。

2. 数据库查询与总数统计

分页需要两个关键数据:当前页的数据列表和总记录数。以MySQL为例,假设有一个文章表articles

立即学习go语言免费学习笔记(深入)”;

type Article struct {
    ID      int    `json:"id"`
    Title   string `json:"title"`
    Content string `json:"content"`
    Created time.Time `json:"created"`
}
<p>func GetArticles(p *Pagination) ([]Article, int64, error) {
var articles []Article
var total int64</p><pre class='brush:php;toolbar:false;'>db := GetDB() // 获取数据库连接(*sql.DB 或 GORM DB)

// 先获取总数量
db.Model(&Article{}).Count(&total)

// 查询分页数据
result := db.Offset(p.GetOffset()).Limit(p.GetLimit()).Find(&articles)
if result.Error != nil {
    return nil, 0, result.Error
}

return articles, total, nil
登录后复制

}

如果你使用原生database/sql,可以这样写:

蓝心千询
蓝心千询

蓝心千询是vivo推出的一个多功能AI智能助手

蓝心千询 34
查看详情 蓝心千询
query := "SELECT id, title, content, created FROM articles LIMIT ? OFFSET ?"
rows, err := db.Query(query, p.GetLimit(), p.GetOffset())
...
登录后复制

3. 构建分页响应结果

返回给前端的数据应包含列表、总数、当前页、页大小等信息,便于前端控制翻页逻辑:

type PaginatedResult struct {
    Data       interface{} `json:"data"`
    Total      int64       `json:"total"`
    Page       int         `json:"page"`
    PageSize   int         `json:"page_size"`
    TotalPages int         `json:"total_pages"`
}
<p>func NewPaginatedResult(data interface{}, total int64, page, pageSize int) *PaginatedResult {
totalPages := int((total + int64(pageSize) - 1) / int64(pageSize))
return &PaginatedResult{
Data:       data,
Total:      total,
Page:       page,
PageSize:   pageSize,
TotalPages: totalPages,
}
}</p>
登录后复制

4. 在HTTP接口中集成分页

以Gin框架为例,实现一个分页查询接口:

func GetArticlesHandler(c *gin.Context) {
    var pagination Pagination
<pre class='brush:php;toolbar:false;'>// 绑定查询参数
if err := c.ShouldBindQuery(&pagination); err != nil {
    c.JSON(400, gin.H{"error": err.Error()})
    return
}

// 设置默认值
if pagination.Page == 0 {
    pagination.Page = 1
}
if pagination.PageSize == 0 {
    pagination.PageSize = 10
}

articles, total, err := GetArticles(&pagination)
if err != nil {
    c.JSON(500, gin.H{"error": "查询失败"})
    return
}

result := NewPaginatedResult(articles, total, pagination.Page, pagination.PageSize)
c.JSON(200, result)
登录后复制

}

前端可以通过/articles?page=1&page_size=10进行访问,后端自动完成分页处理。

基本上就这些。这套模式简单清晰,适用于大多数中小型项目。随着业务复杂度上升,可进一步封装成通用分页工具函数,支持排序、条件筛选等扩展功能。关键是理解分页的核心逻辑:偏移计算、数量限制和总数返回。

以上就是如何在Golang中实现基础的分页查询功能_Golang分页查询项目实战汇总的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号