封装数据类型 原创
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 主要处理数据过滤、排序等功能。