struct.go 2.1 KB

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