|
|
@@ -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
|
|
|
+}
|