package pagination import ( "math" ) type Paginator interface { // Limit 数据条目数限制 Limit() int32 // Offset 数据偏移量 Offset() int32 } const ( // DefaultPage 默认分页数 DefaultPage = 1 // DefaultPageSize 默认分页条目数 DefaultPageSize = 20 ) var _ Paginator = (*Pagination)(nil) type options struct { total int32 } type Option func(*options) type Pagination struct { page int32 pageSize int32 total int32 } func WithTotal(b int32) Option { return func(c *options) { c.total = b } } func NewPagination(page, pageSize int32, opts ...Option) *Pagination { opt := options{ total: 0, } for _, o := range opts { o(&opt) } return &Pagination{page: page, pageSize: pageSize, total: opt.total} } func (p Pagination) Page() int32 { if p.page < 1 { return DefaultPage } return p.page } func (p Pagination) PageSize() int32 { if p.pageSize < 1 { return DefaultPageSize } return p.pageSize } func (p Pagination) From() int32 { return (p.Page()-1)*p.PageSize() + 1 } func (p Pagination) To() int32 { var to int32 to = p.PageSize() * p.Page() if to > p.total { to = p.total } return to } func (p Pagination) LastPage() int32 { lastPage := math.Ceil(float64(p.total) / float64(p.PageSize())) if lastPage <= 0 { lastPage = 0 } return int32(lastPage) } // Limit 实现 pagination.Paginator 方法 func (p Pagination) Limit() int32 { return p.PageSize() } func (p Pagination) Offset() int32 { return p.Limit() * (p.Page() - 1) }