分页是我们经常用到的一个需求,我们现在来说一说使用go语言如何写分页。
讲到分页,我们一般都是在db层面去处理,可以使用limit和偏移量进行处理。那如果,我们的架构中用的是缓存,使用缓存进行数据的输入输出又该怎么处理呢???
下边我们写一个分页服务,直接上代码:
package page
import (
"github.com/druidcaesa/gotool"
"github.com/go-xorm/xorm"
)
// Page 分页结构体
type Page struct {
Size int `json:"size"` //显示条数
Total int64 `json:"total"` //总条数
List interface{} `json:"list"` //数据
}
type Start struct {
}
// StartSize 获取分页偏移量
func StartSize(pageNum int, size int) int {
if pageNum == 0 {
pageNum = 1
}
if size == 0 {
size = 10
}
num := (pageNum - 1) * size
return num
}
// GetTotal 获取总条数
func GetTotal(engine *xorm.Session, args ...interface{}) (int64, error) {
if args != nil {
engine.Table(args)
}
count, err := engine.Count()
if err != nil {
gotool.Logs.ErrorLog().Println(err.Error())
return 0, err
}
return count, nil
}
这里其实我们还可以进行优化
在Page的struct中加入以下内容
// Page 分页结构体
type Page struct {
Size int //显示条数
Total int64 //总条数
Current int64 //当前页
PageNum int64 //总页数
Data []interface{} //数据
Extend interface{} //备用插口,扩展信息
}
这里,我们加入了一个extend,他可以为我们返回数据以外的信息。