12

一个简单的 Golang 分页查询通用接口

 2 years ago
source link: https://www.sulinehk.com/post/a-simple-general-interface-for-paging-query-in-golang/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一个简单的 Golang 分页查询通用接口

2020-11-18

本文介绍了一个简单的 Golang 分页查询通用接口。

Golang Logo

// PageIterator 分页查询接口
type PageIterator interface {
	// Has 查询是否还有下一页
	Has() bool
	// Next 获取下一页
	Next() (int, int)
}

// pageIterator 实现 PageIterator 接口
type pageIterator struct {
	total int
	max   int
	cur   int
}

// Has 查询是否还有下一页
func (p *pageIterator) Has() bool {
	return p.cur*p.max < p.total
}

// Next 获取下一页
func (p *pageIterator) Next() (int, int) {
	offset := p.cur * p.max
	limit := min((p.cur+1)*p.max, p.total)
	p.cur++
	return offset, limit
}

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

// NewPageIterator 新建分页查询迭代器
func NewPageIterator(total, max int) PageIterator {
	return &pageIterator{total: total, max: max, cur: 0}
}

const pageSize = 500

// Do 将数据分成每份不超过 pageSize,分别进行处理,直到没有数据
func Do(total int, call func(offset, limit int) error) error {
	iterator := NewPageIterator(total, pageSize)
	for iterator.Has() {
		if err := call(iterator.Next()); err != nil {
			return err
		}
	}
	return nil
}

详细说明请看代码注释。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK