如何在Golang中实现分页功能_Golang Web分页加载与实现方法-Golang

Go语言分页需安全解析HTTP参数并校验page≥1、size在1–100间,用OFFSET/LIMIT时注意高偏移性能问题,推荐游标分页;响应应含Total、Page、TotalPages等元信息。

Go 语言本身不提供开箱即用的分页组件,但通过组合 database/sql(或 gorm)、HTTP 请求参数解析和结构化响应,能简洁、可控地实现分页——关键不是“用什么库”,而是怎么设计 offset/limit 逻辑和处理边界。

如何从 HTTP 请求中安全提取 page 和 size 参数

用户传来的 page 和 size 是字符串,必须显式校验并转为整数,否则直接用于 SQL 会导致 panic 或注入风险(即使用了预处理,非法值仍可能破坏业务逻辑)。

  • page 应 ≥ 1,0 或负数视为第 1 页;size 建议限制范围(如 1–100),超限则截断或返回错误
  • 用 strconv.ParseInt() 而非 strconv.Atoi(),便于区分空值和格式错误
  • 推荐封装成可复用函数,例如:
    func parsePageQuery(r *http.Request) (page, size int64, err error) {
        page, err = strconv.ParseInt(r.URL.Query().Get("page"), 10, 64)
        if err != nil || page < 1 {
            page = 1
        }
        size, err = strconv.ParseInt(r.URL.Query().Get("size"), 10, 64)
        if err != nil || size  100 {
            size = 100
        }
        return
    }

使用 OFFSET/LIMIT 实现数据库分页的注意事项

MySQL/PostgreSQL/SQLite 都支持 LIMIT offset, count,但高偏移量(如 OFFSET 100000)性能会急剧下降——数据库仍需扫描并跳过前面所有行。

  • 避免在总记录数未知时盲目用 OFFSET:先查总数(SELECT COUNT(*))再分页,适合中小数据集;大数据量建议用游标分页(基于上一页最后 ID 或时间戳)
  • 计算 offset 时注意:第 1 页对应 offset = 0,公式是 (page - 1) * size,别写成 page * size
  • 若用 gorm,调用 Limit(size).Offset(offset) 即可,但需确保 offset 非负;Limit(0) 会被忽略,Offset(0) 安全

构造带分页元信息的 JSON 响应结构

前端需要知道当前页、总页数、总数、是否有下一页等,不能只返回数据列表。硬编码字段名易出错,建议定义结构体统一序列化。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在Golang中实现分页功能_Golang Web分页加载与实现方法-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3999169+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3999169+
  • 本周更新: 0+
  • 最后更新: 2026-03-16