struct.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package format
  2. import (
  3. "fmt"
  4. "gbase/glog"
  5. "reflect"
  6. "strconv"
  7. "strings"
  8. )
  9. // 解析gorm标签,返回键值对
  10. func ParseGormTag(tag string) map[string]string {
  11. result := make(map[string]string)
  12. pairs := strings.Split(tag, ";")
  13. for _, pair := range pairs {
  14. kv := strings.Split(pair, ":")
  15. if len(kv) == 2 {
  16. result[kv[0]] = kv[1]
  17. } else {
  18. result[kv[0]] = ""
  19. }
  20. }
  21. return result
  22. }
  23. // 将map的值赋给struct
  24. func MapToStruct(input map[string]interface{}, output interface{}) error {
  25. defer func() {
  26. if r := recover(); r != nil {
  27. glog.XWarning(fmt.Sprintf("MapToStruct %v panic: %v\n", input, r))
  28. }
  29. }()
  30. outputValue := reflect.ValueOf(output).Elem()
  31. outputType := outputValue.Type()
  32. for i := 0; i < outputType.NumField(); i++ {
  33. field := outputType.Field(i)
  34. column := field.Tag.Get("gorm")
  35. if column == "" {
  36. continue
  37. }
  38. tags := ParseGormTag(column)
  39. columnName := tags["column"]
  40. if value, ok := input[columnName]; ok {
  41. fieldValue := outputValue.FieldByName(field.Name)
  42. if fieldValue.CanSet() {
  43. val := reflect.ValueOf(value)
  44. if val.Type().ConvertibleTo(fieldValue.Type()) {
  45. fieldValue.Set(val.Convert(fieldValue.Type()))
  46. } else {
  47. // 特别处理常见的类型转换
  48. switch fieldValue.Kind() {
  49. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  50. if intValue, err := strconv.Atoi(fmt.Sprintf("%v", value)); err == nil {
  51. fieldValue.SetInt(int64(intValue))
  52. }
  53. case reflect.String:
  54. fieldValue.SetString(fmt.Sprintf("%v", value))
  55. case reflect.Float32, reflect.Float64:
  56. if floatValue, err := strconv.ParseFloat(fmt.Sprintf("%v", value), 64); err == nil {
  57. fieldValue.SetFloat(floatValue)
  58. }
  59. }
  60. }
  61. }
  62. }
  63. }
  64. return nil
  65. }
  66. func ConvertNilToEmptyString(data interface{}) interface{} {
  67. switch v := data.(type) {
  68. case nil:
  69. return ""
  70. case map[string]interface{}:
  71. for key, val := range v {
  72. v[key] = ConvertNilToEmptyString(val)
  73. }
  74. case []interface{}:
  75. for i, val := range v {
  76. v[i] = ConvertNilToEmptyString(val)
  77. }
  78. }
  79. //去除字符串左边和右边的空格
  80. if reflect.TypeOf(data).Kind() == reflect.String {
  81. data = strings.TrimLeft(data.(string), " ")
  82. data = strings.TrimRight(data.(string), " ")
  83. } else if reflect.TypeOf(data).Kind() == reflect.Float64 {
  84. if data.(float64) > 9000 {
  85. data = fmt.Sprintf("%v", int64(data.(float64)))
  86. } else {
  87. data = fmt.Sprintf("%v", data.(float64))
  88. }
  89. } else if reflect.TypeOf(data).Kind() == reflect.Float32 {
  90. if data.(float32) > 9000 {
  91. data = fmt.Sprintf("%v", int64(data.(float32)))
  92. } else {
  93. data = fmt.Sprintf("%v", data.(float32))
  94. }
  95. } else if reflect.TypeOf(data).Kind() == reflect.Int64 {
  96. data = fmt.Sprintf("%v", data)
  97. } else if reflect.TypeOf(data).Kind() == reflect.Int32 {
  98. data = fmt.Sprintf("%v", data)
  99. } else if reflect.TypeOf(data).Kind() == reflect.Int {
  100. data = fmt.Sprintf("%v", data)
  101. }
  102. return data
  103. }