Help us shape the future of Go! Take the 2026 Go Developer Survey

pagination

package
v0.27.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 25, 2026 License: MIT Imports: 0 Imported by: 0

Documentation

Overview

Package pagination 提供框架无关的分页参数定义。

本包是 PageRequest 的唯一定义位置,middleware 和 data/gormx 均依赖本包, 避免 middleware 层反向依赖 data 层。

Index

Constants

View Source
const (
	// DefaultPage 是默认页码。
	DefaultPage = 1
	// DefaultPageSize 是默认每页条数。
	DefaultPageSize = 20
	// MaxPageSize 是每页最大条数。
	MaxPageSize = 500
)

Variables

This section is empty.

Functions

This section is empty.

Types

type OverMaxPolicy added in v0.25.2

type OverMaxPolicy int

OverMaxPolicy 描述「请求页长超过上限」时的处理语义。

两种语义都真实存在于消费方,且**响应条数不同**(可观测差异,不能顺手统一):

  • OverMaxClamp:钳到 MaxPageSize(pkg/pagination 现行语义)。
  • OverMaxFallback:回退到 DefaultPageSize。
const (
	// OverMaxClamp 把超限的页长钳到 MaxPageSize。
	// 这是 OverMaxPolicy 的零值,也是 pkg/pagination 的现行语义。
	OverMaxClamp OverMaxPolicy = iota

	// OverMaxFallback 把超限的页长回退到 DefaultPageSize。
	OverMaxFallback
)

type PageRequest

type PageRequest struct {
	Page     int `json:"page" query:"page" form:"page"`
	PageSize int `json:"page_size" query:"page_size" form:"page_size"`
}

PageRequest 表示分页查询请求参数。

func NewPageRequest

func NewPageRequest(page, pageSize int) *PageRequest

NewPageRequest 根据页码和每页条数创建 PageRequest。

func (*PageRequest) Limit

func (r *PageRequest) Limit() int

Limit 返回分页查询的限制条数。

func (*PageRequest) Normalize

func (r *PageRequest) Normalize()

Normalize 规范化分页参数,为非法值设置默认值,并限制最大每页条数。

func (*PageRequest) Offset

func (r *PageRequest) Offset() int

Offset 返回分页查询的偏移量。 当计算结果溢出时返回 0(回退到第一页)。 只读:不在接收者上落 Normalize 的写 — 共享 PageRequest(如全局默认值) 并发调 Offset/Limit 时是数据竞争(2026-09-06 复审修复)。

type PageResponse

type PageResponse[T any] struct {
	Items    []T   `json:"items"`
	Total    int64 `json:"total"`
	Page     int   `json:"page"`
	PageSize int   `json:"page_size"`
	Pages    int   `json:"pages"`
}

PageResponse 是全库统一的分页响应信封。

此前 data/gormx(JSON "list")与 data/crud(JSON "items")各有一个 字段名/JSON 契约不同的泛型分页结构,导致 API 契约分叉;两者已统一 为本类型的类型别名,新代码直接使用 pagination.PageResponse。

字段取舍说明:数据字段名采用 items(与 handler/crudh 的 REST 契约 一致),pages 保留 gormx 语义(总页数,向上取整)。

type Policy added in v0.25.2

type Policy struct {
	// DefaultPage 是非法页码(<= 0)时归一化到的页码。
	DefaultPage int
	// DefaultPageSize 是非法页长(<= 0)时归一化到的页长。
	DefaultPageSize int
	// MaxPageSize 是页长上限;< 0 表示不限上限。
	MaxPageSize int
	// OverMax 是页长超上限时的处理语义。
	OverMax OverMaxPolicy
}

Policy 是服务级分页口径——把「默认页长 / 上限 / 超限语义」从包级常量里提出来, 让每个服务声明自己的口径,而不是各写一份归一化逻辑。

零值退回包级默认(DefaultPage / DefaultPageSize / MaxPageSize / OverMaxClamp), 因此 `Policy{}` 与包级常量口径完全一致。

字段语义:

  • DefaultPage:<= 0 时取包级 DefaultPage。
  • DefaultPageSize:<= 0 时取包级 DefaultPageSize。
  • MaxPageSize:== 0 时取包级 MaxPageSize;< 0 表示**不限上限**(如「默认 20、不设上限」 的服务);> 0 时为该服务的页长上限。
  • OverMax:页长超上限时的语义;未知取值按 OverMaxClamp 处理。

例:默认 50、上限 200、超限回退默认(等价于把口径写死在服务里):

Policy{DefaultPageSize: 50, MaxPageSize: 200, OverMax: OverMaxFallback}

例:默认 20、不限上限:

Policy{DefaultPageSize: 20, MaxPageSize: -1}

func (Policy) Limit added in v0.25.2

func (p Policy) Limit(page, pageSize int) int

Limit 返回按本口径归一化后的限制条数。

func (Policy) Normalize added in v0.25.2

func (p Policy) Normalize(page, pageSize int) (int, int)

Normalize 按本口径归一化页码与页长,返回归一化后的 (page, pageSize)。

规则:

  • page <= 0 ⇒ 口径的默认页码。
  • pageSize <= 0 ⇒ 口径的默认页长。
  • pageSize 超上限 ⇒ 按 OverMax 语义处理:钳到上限(OverMaxClamp) 或回退到默认页长(OverMaxFallback);口径不限上限时原样返回。

纯函数,不修改入参。

func (Policy) Offset added in v0.25.2

func (p Policy) Offset(page, pageSize int) int

Offset 返回按本口径归一化后的偏移量。 归一化结果溢出(int 溢出成负数)时返回 0(回退到第一页)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL