util.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. // 根据指定字符排序
  35. //
  36. // m := []map[string]int{
  37. // {"k": 2},
  38. // {"k": 1},
  39. // {"k": 3},
  40. // }
  41. //
  42. // customer.SortData(&m, "k", true)
  43. // ture 倒序3, 2, 1
  44. // fmt.Println(m)
  45. func SortData(data interface{}, sortkey string, reverse bool) {
  46. //func SortData(data interface{}, sortkey string, reverse bool) {
  47. var db []map[string]interface{}
  48. err := Bind(data, &db)
  49. if err != nil {
  50. fmt.Println(err)
  51. return
  52. }
  53. stb := SortBy{db, sortkey}
  54. if !reverse {
  55. sort.Sort(stb)
  56. } else {
  57. sort.Sort(sort.Reverse(stb))
  58. }
  59. err = Bind(stb.Data, data)
  60. if err != nil {
  61. fmt.Println(err)
  62. }
  63. }
  64. func Bind(data interface{}, ret interface{}) error {
  65. v := reflect.ValueOf(ret)
  66. if v.Kind() != reflect.Ptr {
  67. return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
  68. }
  69. havdata := false
  70. var bk interface{}
  71. if v.Elem().Kind() == reflect.Slice {
  72. t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
  73. bk = v.Elem().Interface()
  74. v.Elem().Set(t)
  75. havdata = true
  76. }
  77. _data, _ := json.MarshalIndent(data, "", " ")
  78. err := json.Unmarshal(_data, ret)
  79. if err != nil {
  80. fmt.Println(err)
  81. if havdata {
  82. v.Elem().Set(reflect.ValueOf(bk))
  83. }
  84. return err
  85. }
  86. return nil
  87. }