问题背景:
前端需要分页展示列表信息,一般做法是按照前端约定的page 和pagesize 查询数据库,取出来pagesize个数据,然后根据数据库的信息比如ID去请求各种下游服务聚合各种返回的信息,如果某个必须展示的信息缺失,比如没有图片的话,就要过滤掉这条数据,这样返回给前端的列表个数就会少于pagesize,需要解决这个问题
解决:
因为不确认会有多少条元素缺失的情况,如果存在多个连续缺失的元素,而您希望每页返回的数量保持一致,可以使用循环来处理。
func getItems(pageNumber, pageSize int) ([]Item, error) {
offset := (pageNumber - 1) * pageSize
limit := pageSize + 1 // 获取多一个元素,用于判断是否有下一页
var items []Item
for len(items) < pageSize {
// 执行查询,并使用 OFFSET 和 LIMIT 子句进行分页
partialItems, err := db.Query("SELECT * FROM items OFFSET \$1 LIMIT \$2", offset, limit)
if err != nil {
return nil, err
}
//这里请求下游做各种信息聚合, 可能会过滤元素缺失的数据
/* .......*/
juheItems := juhefunc(partialItems)
// 将聚合结果添加到 items 切片中
items = append(items, juheItems...)
// 如果查询结果数量少于 limit,说明已经没有更多数据了
if len(partialItems) < limit {
break
}
// 更新 offset,继续查询下一页
offset += limit
}
return items[:pageSize], nil
}