| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- package cache
- import (
- "reflect"
- "slices"
- "sort"
- )
- // 分页相关类型定义
- type (
- // PagingFilterFunc 过滤回调函数类型
- // 过滤函数用于决定数据项是否应该包含在查询结果中:
- // - 返回值为 true:表示该数据项满足过滤条件,应包含在结果中
- // - 返回值为 false:表示该数据项不满足过滤条件,应排除在结果之外
- // 例如,过滤价格大于100的商品:
- // func(item Product) bool {
- // return item.Price > 100
- // }
- // 过滤特定类型的装备:
- // func(item Equipment) bool {
- // return item.Type == "武器" || item.Type == "盔甲"
- // }
- PagingFilterFunc[T any] func(item T) bool
- // PagingCompareFunc 比较回调函数类型,用于排序
- // 比较函数的返回值定义了两个元素在排序中的相对位置:
- // - 返回值 < 0:表示a应该排在b之前
- // - 返回值 == 0:表示a和b在排序中地位相等
- // - 返回值 > 0:表示a应该排在b之后
- // 例如,实现升序排序:
- // func(a, b int) int {
- // return a - b
- // }
- // 实现降序排序:
- // func(a, b int) int {
- // return b - a
- // }
- PagingCompareFunc[T any] func(a, b T) int
- // Paging 泛型分页数据结构
- Paging[T any] struct {
- data []T
- }
- )
- // NewPaging 创建新的Paging实例
- func NewPaging[T any]() *Paging[T] {
- return &Paging[T]{
- data: make([]T, 0),
- }
- }
- // Add 添加数据到Paging
- func (p *Paging[T]) Add(item T) {
- p.data = append(p.data, item)
- }
- // AddAll 批量添加数据到Paging
- func (p *Paging[T]) AddAll(items []T) {
- p.data = append(p.data, items...)
- }
- // 根据指定的 comparator fn排序
- func (p *Paging[T]) Sort(comparator PagingCompareFunc[T]) {
- if comparator == nil || p.Count() <= 1 {
- return
- }
- sorted := make([]T, 0, len(p.data))
- copy(sorted, p.data)
- sort.SliceStable(sorted, func(i, j int) bool {
- return comparator(sorted[i], sorted[j]) < 0
- })
- p.data = sorted
- }
- // Query 查询方法,支持分页、过滤和排序
- // filter参数为本次查询的过滤条件,comparator参数为本次查询的比较条件
- func (p *Paging[T]) Query(pageNum, pageSize int32, filter PagingFilterFunc[T], comparator PagingCompareFunc[T]) (total int32, data []T) {
- // 验证参数
- if pageNum < 1 {
- pageNum = 1
- }
- if pageSize < 1 {
- pageSize = 10
- }
- // 应用过滤
- filteredData := make([]T, 0, len(p.data))
- for _, item := range p.data {
- if filter == nil || filter(item) {
- filteredData = append(filteredData, item)
- }
- }
- // 计算总数
- total = int32(len(filteredData))
- if total == 0 {
- return 0, nil
- }
- // 应用排序
- if comparator != nil {
- sort.SliceStable(filteredData, func(i, j int) bool {
- return comparator(filteredData[i], filteredData[j]) < 0
- })
- }
- // 计算分页
- start := (pageNum - 1) * pageSize
- if start >= total {
- return total, nil
- }
- end := min(start+pageSize, total)
- return total, filteredData[start:end]
- }
- // Clear 清空所有数据
- func (p *Paging[T]) Clear() {
- p.data = make([]T, 0)
- }
- // Count 获取总数据量
- func (p *Paging[T]) Count() int32 {
- return int32(len(p.data))
- }
- // IndexOf 返回元素 item 在内部切片中的下标,找不到返回 -1。
- // 使用 reflect.DeepEqual 进行比较,适用于大多数类型。
- func (p *Paging[T]) IndexOf(item T) int {
- for i, v := range p.data {
- if reflect.DeepEqual(v, item) {
- return i
- }
- }
- return -1
- }
- // Remove 删除第一次出现的指定元素,删除成功返回 被删除的元素 和 true,否则返回零值和 false。
- func (p *Paging[T]) Remove(item T) (T, bool) {
- idx := p.IndexOf(item)
- var zero T
- if idx == -1 {
- return zero, false
- }
- return p.RemoveAt(idx)
- }
- // RemoveAt 删除指定下标的元素(按切片索引),成功返回 被删除的元素 和 true,索引越界返回 零值 和 false。
- func (p *Paging[T]) RemoveAt(index int) (T, bool) {
- var zero T
- if index < 0 || index >= len(p.data) {
- return zero, false
- }
- removed := p.data[index]
- p.data = slices.Delete(p.data, index, index+1)
- return removed, true
- }
- // ForEach 遍历所有元素
- func (p *Paging[T]) ForEach(f func(item T)) {
- for _, item := range p.data {
- f(item)
- }
- }
|