struct.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. }