Skip to content

封装数据类型 原创

1、封装过滤、分页数据类型

internal\pkg\k8s\dataselect\dataselector.go,写入以下内容:

go
package k8s

import (
	"sort"
	"strings"
	"time"
)

// DataSelector 用于封装排除、过滤以及分页的数据类型
type DataSelector struct {
	GenericDataList []DataCell
	DataSelect      *DataSelectQuery
}

// DataCell 数据转换接口
// GetCreation 获取创建时间
// GetName 获取对象名称
type DataCell interface {
	GetCreation() time.Time
	GetName() string
}

// DataSelectQuery 定义过滤和分页的结构体
// 过滤使用的 Name
// 分页使用的 Limit 和 Page
// Limit 是单页数据条数
// Page 是第几页
type DataSelectQuery struct {
	Filter   *FilterQuery
	Paginate *PaginateQuery
}

type FilterQuery struct {
	Name string
}

type PaginateQuery struct {
	Limit int
	Page  int
}

// 实现自定义结构的排序
// 需要重写 Len(),Swap(),Less()

// Len 用户获取数据的长度
func (d *DataSelector) Len() int {
	return len(d.GenericDataList)
}

// Swap 用于数据比较大小之后的位置变更
// i,j 数组下标
func (d *DataSelector) Swap(i, j int) {
	d.GenericDataList[i], d.GenericDataList[j] = d.GenericDataList[j], d.GenericDataList[i]
}

// Less 用于比较大小
// i,j 数组下标
func (d *DataSelector) Less(i, j int) bool {
	a := d.GenericDataList[i].GetCreation()
	b := d.GenericDataList[j].GetCreation()
	return b.Before(a)
}

// Sort 用于触发排序
func (d *DataSelector) Sort() *DataSelector {
	sort.Sort(d)
	return d
}

// Filter 用于过滤数据
// 比较数据的 Name 属性,若包含,则返回
func (d *DataSelector) Filter() *DataSelector {
	// 如果 Name 为空,直接返回所有数据
	if d.DataSelect.Filter.Name == "" {
		return d
	}

	// 如果 Name 不为空,按 Name 进行过滤
	// 声明新的数组,若 Name 包含,则把数据放进数组,返回进去
	var filterD []DataCell
	for _, value := range d.GenericDataList {
		// 定义是否匹配的标签变量,默认是匹配
		objName := value.GetName()

		if !strings.Contains(objName, d.DataSelect.Filter.Name) {
			continue
		}

		filterD = append(filterD, value)
	}
	d.GenericDataList = filterD
	return d
}

// Paginate 用于数组分页,根据Limit和Page传参,返回数据
func (d *DataSelector) Paginate() *DataSelector {
	// 更具Limit和page 获取变量
	limit := d.DataSelect.Paginate.Limit
	page := d.DataSelect.Paginate.Page

	// 检验参数合法性
	if limit <= 0 || page <= 0 {
		return d
	}

	// 定义取数范围
	startIndex := limit * (page - 1)
	endIndex := limit*page - 1

	if endIndex > len(d.GenericDataList) {
		endIndex = len(d.GenericDataList)
	}

	d.GenericDataList = d.GenericDataList[startIndex:endIndex]
	return d
}

首先定义了 DataSelector 数据类型,它实现了过滤、排序等功能。在 DataSelector 里包含两个参数:GenericDataList 以及 DataSelect。其中,GenericDataList 主要是实现数据转换的接口,我们需要在实际操作中先实现 DataCell,才能使用 GetCreation 和 GetName 两个方法。DataSelect 主要处理数据过滤、排序等功能。

最近更新