utils.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package util
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "sort"
  7. )
  8. // 排序 排序键必须为数字类型
  9. type SortBy struct {
  10. Data []map[string]interface{}
  11. Sortkey string
  12. }
  13. func (a SortBy) Len() int { return len(a.Data) }
  14. func (a SortBy) Swap(i, j int) {
  15. a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
  16. }
  17. func (a SortBy) Less(i, j int) bool {
  18. //return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
  19. m := a.Data[i][a.Sortkey]
  20. n := a.Data[j][a.Sortkey]
  21. w := reflect.ValueOf(m)
  22. v := reflect.ValueOf(n)
  23. switch v.Kind() {
  24. case reflect.String:
  25. return w.String() < v.String()
  26. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  27. return w.Int() < v.Int()
  28. case reflect.Float64, reflect.Float32:
  29. return w.Float() < v.Float()
  30. default:
  31. return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
  32. }
  33. }
  34. // data 转换成ret
  35. func Bind(data interface{}, ret interface{}) error {
  36. v := reflect.ValueOf(ret)
  37. if v.Kind() != reflect.Ptr {
  38. return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
  39. }
  40. havdata := false
  41. var bk interface{}
  42. if v.Elem().Kind() == reflect.Slice {
  43. t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
  44. bk = v.Elem().Interface()
  45. v.Elem().Set(t)
  46. havdata = true
  47. }
  48. _data, _ := json.MarshalIndent(data, "", " ")
  49. err := json.Unmarshal(_data, ret)
  50. if err != nil {
  51. fmt.Println(err)
  52. if havdata {
  53. v.Elem().Set(reflect.ValueOf(bk))
  54. }
  55. return err
  56. }
  57. return nil
  58. }
  59. //根据指定字符排序
  60. //m := []map[string]int{
  61. // {"k": 2},
  62. // {"k": 1},
  63. // {"k": 3},
  64. //}
  65. //
  66. //customer.SortData(&m, "k", true)
  67. // ture 倒序3, 2, 1
  68. //fmt.Println(m)
  69. func SortData(data interface{}, sortkey string, reverse bool) {
  70. //func SortData(data interface{}, sortkey string, reverse bool) {
  71. var db []map[string]interface{}
  72. err := Bind(data, &db)
  73. if err != nil {
  74. fmt.Println(err)
  75. return
  76. }
  77. stb := SortBy{db, sortkey}
  78. if !reverse {
  79. sort.Sort(stb)
  80. } else {
  81. sort.Sort(sort.Reverse(stb))
  82. }
  83. err = Bind(stb.Data, data)
  84. if err != nil {
  85. fmt.Println(err)
  86. }
  87. }