
本文介绍如何在 Go 中实现类似 的智能分页逻辑,支持自定义当前页、邻近页数量及首尾固定页数,兼顾性能与可读性。
本文介绍如何在 go 中实现类似 `` 的智能分页逻辑,支持自定义当前页、邻近页数量及首尾固定页数,兼顾性能与可读性。
在 Web 开发中,当数据量庞大时,展示全部页码(如 1–201)既不美观也不实用。理想的分页导航应具备「上下文感知」能力:在当前页靠近开头或结尾时自动收缩中间省略区域,并始终保留首尾若干页(如 1, 2 和 200, 201),中间仅显示围绕当前页的连续页码(如 24–27),并用 ... 清晰分隔。
下面是一个轻量、无依赖、内存友好的 Go 分页生成器实现,核心逻辑清晰,易于集成到模板渲染或 API 响应中:
func GeneratePagination(
currentPage, totalPages, around, startCount, endCount int,
render func(page int), // page <p>✅ <strong>使用示例(HTML 片段生成)</strong>:</p><pre class="brush:php;toolbar:false;">var htmlParts []string
GeneratePagination(25, 201, 3, 2, 2, func(p int) {
switch {
case p == -1:
htmlParts = append(htmlParts, `
⚠️ 关键注意事项:
-
around控制当前页左右各显示多少页(默认3→ 显示22–28); -
startCount/endCount决定首尾固定页数(如设为2则恒显1,2和200,201); - 所有边界条件(如
currentPage=1、currentPage=totalPages、totalPages ≤ 5)均被自然覆盖,无需额外分支; - 函数采用回调(callback)设计,解耦逻辑与渲染,支持 HTML、JSON、CLI 等多种输出形式;
- 时间复杂度 O(k),k 为最终生成的页码项数(通常 ≤ 15),零分配(除 callback 外不创建切片)。
? 进阶建议:
- 可封装为
Pagination结构体,嵌入URLBase,QueryParamPage,QueryParamLimit等字段,提升复用性; - 在 Gin / Echo 等框架中,可作为中间件注入
PaginationData到 context; - 若需服务端预渲染完整 HTML 字符串,可用闭包收集字符串切片,但注意避免大页码场景下的内存累积。
该方案摒弃了“枚举所有页再过滤”的低效思路,转而模拟人类书写逻辑——先写头、再跳、再写中、再跳、最后写尾,简洁、健壮、高性能,是 Go 生态中构建专业分页体验的推荐实践。










