QiuSW преди 1 година
родител
ревизия
1d5761a9b3
променени са 1 файла, в които са добавени 65 реда и са изтрити 0 реда
  1. 65 0
      format/struct.go

+ 65 - 0
format/struct.go

@@ -0,0 +1,65 @@
+package format
+
+import (
+	"fmt"
+	"reflect"
+	"strconv"
+	"strings"
+)
+
+// 解析gorm标签,返回键值对
+func ParseGormTag(tag string) map[string]string {
+	result := make(map[string]string)
+	pairs := strings.Split(tag, ";")
+	for _, pair := range pairs {
+		kv := strings.Split(pair, ":")
+		if len(kv) == 2 {
+			result[kv[0]] = kv[1]
+		} else {
+			result[kv[0]] = ""
+		}
+	}
+	return result
+}
+
+// 将map的值赋给struct
+func MapToStruct(input map[string]interface{}, output interface{}) error {
+	outputValue := reflect.ValueOf(output).Elem()
+	outputType := outputValue.Type()
+
+	for i := 0; i < outputType.NumField(); i++ {
+		field := outputType.Field(i)
+		column := field.Tag.Get("gorm")
+		if column == "" {
+			continue
+		}
+
+		tags := ParseGormTag(column)
+		columnName := tags["column"]
+
+		if value, ok := input[columnName]; ok {
+			fieldValue := outputValue.FieldByName(field.Name)
+			if fieldValue.CanSet() {
+				val := reflect.ValueOf(value)
+				if val.Type().ConvertibleTo(fieldValue.Type()) {
+					fieldValue.Set(val.Convert(fieldValue.Type()))
+				} else {
+					// 特别处理常见的类型转换
+					switch fieldValue.Kind() {
+					case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+						if intValue, err := strconv.Atoi(fmt.Sprintf("%v", value)); err == nil {
+							fieldValue.SetInt(int64(intValue))
+						}
+					case reflect.String:
+						fieldValue.SetString(fmt.Sprintf("%v", value))
+					case reflect.Float32, reflect.Float64:
+						if floatValue, err := strconv.ParseFloat(fmt.Sprintf("%v", value), 64); err == nil {
+							fieldValue.SetFloat(floatValue)
+						}
+					}
+				}
+			}
+		}
+	}
+	return nil
+}