app_info_evn.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package sort
  2. import (
  3. "github.com/IceWhaleTech/CasaOS/model"
  4. "sort"
  5. )
  6. // 数据集类型, 与上一篇排序文章(多字段单独排序)比较, less字段的数据类型不再是 func(p1, p2 *Change) bool
  7. // 而是 []func(p1, p2 *Change) bool 因为在第一个比较的值相等的情况下, 还要比较第二个值, 所以这里需要多个比较函数
  8. type evnSorter struct {
  9. evn []model.Envs
  10. less []lessFuncEnv
  11. }
  12. // sort接口方法之一(Less)
  13. type lessFuncEnv func(p1, p2 *model.Envs) bool
  14. // Sort 函数有两个作用
  15. // 第一, 将参数(实际的数据集)赋值给ms对象
  16. // 第二, 调用内置sort函数进行排序操作
  17. func (ms *evnSorter) Sort(env []model.Envs) {
  18. ms.evn = env
  19. sort.Sort(ms)
  20. }
  21. // OrderedBy 函数的作用是返回一个multiSorter实例, 并将所有的实际排序函数赋值给实例的less字段,
  22. // 上面已经为multiSorter结构体定义了Sort方法, 所以该函数的返回值可以直接调用Sort方法进行排序
  23. // 该函数中, 为multiSorter结构体中的less字段赋值, Sort方法中又将实际数据集传入, 赋值给multiSorter的ports字段
  24. // 一个函数, 一个方法调用过后, multiSorter实例中两个字段就已经全部被正确赋值, 可以调用系统sort函数进行排序
  25. // 该函数也可看作是一个工厂方法, 用来生成less字段已经被赋值的multiSorter实例
  26. func EnvSort(less ...lessFuncEnv) *evnSorter {
  27. return &evnSorter{
  28. less: less,
  29. }
  30. }
  31. // Len 为sort接口方法之一
  32. func (ms *evnSorter) Len() int {
  33. return len(ms.evn)
  34. }
  35. // Swap 为sort接口方法之一
  36. func (ms *evnSorter) Swap(i, j int) {
  37. ms.evn[i], ms.evn[j] = ms.evn[j], ms.evn[i]
  38. }
  39. // Less 为sort接口方法之一
  40. func (ms *evnSorter) Less(i, j int) bool {
  41. temp := ms.evn
  42. p, q := &temp[i], &temp[j]
  43. // Try all but the last comparison.
  44. var k int
  45. // 由于可能有多个需要排序的字段, 也就对应了多个less函数, 当第一个字段的值相等时,
  46. // 需要依次尝试比对后续其他字段的值得大小, 所以这里需要获取比较函数的长度, 以便遍历比较
  47. for k = 0; k < len(ms.less)-1; k++ {
  48. // 提取比较函数, 将函数赋值到新的变量中以便调用
  49. less := ms.less[k]
  50. switch {
  51. case less(p, q):
  52. // 如果 p < q, 返回值为true, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回
  53. // 如果 p > q, 返回值为false, 则调到下一个case中处理
  54. return true
  55. case less(q, p):
  56. // 如果 p > q, 返回值为false, 不存在两个值相等需要比较后续字段的情况, 所以这里直接返回
  57. return false
  58. }
  59. // 如果代码走到这里, 说明ms.less[k]函数比较后 p == q; 重新开始下一次循环, 更换到下一个比较函数处理
  60. continue
  61. }
  62. // 如果代码走到这里, 说明所有的比较函数执行过后, 所有比较的值都相等
  63. // 直接返回最后一次的比较结果数据即可
  64. return ms.less[k](p, q)
  65. }