From aece28fff2297517f7c46abaf17665c9291932ea Mon Sep 17 00:00:00 2001 From: Yun Date: Fri, 12 Apr 2024 15:05:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 5 ++ go.sum | 2 + structx.go | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 structx.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e7826b4 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module code.yun.ink/pkg/structx + +go 1.20 + +require code.yun.ink/pkg/convx v1.0.1 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fe3664f --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +code.yun.ink/pkg/convx v1.0.1 h1:T6yIVqyC1nQc9CO0C7iHn5rs7GxbaulmrJtxwg95q9Y= +code.yun.ink/pkg/convx v1.0.1/go.mod h1:6xqmUend1kwarRvJ0TQlfzzS4QCWdRrXQiUY/ggzYqo= diff --git a/structx.go b/structx.go new file mode 100644 index 0000000..2157e7e --- /dev/null +++ b/structx.go @@ -0,0 +1,158 @@ +package structx + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "code.yun.ink/pkg/convx" +) + +type ChangeInfo struct { + Old string `json:"old"` + New string `json:"new"` + Val interface{} `json:"val"` +} + +// 这个方法将map的数据赋值到结构体中 +func AttactToStruct(structxx interface{}, updateMap map[string]string) (map[string]ChangeInfo, error) { + // 将结构体指针转换为reflect.Value类型 + v := reflect.ValueOf(structxx) + // 如果v不是指针或者v是零值,直接返回 + if v.Kind() != reflect.Ptr || v.IsNil() { + return nil, fmt.Errorf("structxx 需要是指针") + } + + changeMap := make(map[string]ChangeInfo) + + // 获取v指向的元素,也就是结构体本身 + v = v.Elem() + // 遍历map的键和值 + for k, val := range updateMap { + // 根据json标签获取结构体中对应的字段 + field := v.FieldByNameFunc(func(name string) bool { + f, _ := v.Type().FieldByName(name) + // fmt.Printf("FieldByNameFunc:%+v\n", f) + js := f.Tag.Get("json") + s := strings.Split(js, ",") + if len(s) > 1 { + return s[0] == k + } + return js == k + }) + // 如果字段存在且可写 + if field.IsValid() && field.CanSet() { + // 根据字段的类型进行类型转换和赋值 + switch field.Kind() { + // convx. + case reflect.Int64: + // 将字符串转换为int64 + oldi := field.Int() + olds, _ := convx.ToString(oldi) + + i, _ := strconv.ParseInt(val, 10, 64) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.String: + olds := field.String() + + field.SetString(val) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: val} + case reflect.Int: + oldi := field.Int() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Int32: + oldi := field.Int() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Int16: + oldi := field.Int() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Int8: + oldi := field.Int() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Uint: + oldi := field.Uint() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Uint32: + oldi := field.Uint() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Uint16: + oldi := field.Uint() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Uint8: + oldi := field.Uint() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Uint64: + oldi := field.Uint() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToInt64(val) + field.SetInt(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Float32: + oldi := field.Float() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToFloat64(val) + field.SetFloat(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + case reflect.Float64: + oldi := field.Float() + olds, _ := convx.ToString(oldi) + + i, _ := convx.ToFloat64(val) + field.SetFloat(i) + + changeMap[k] = ChangeInfo{Old: olds, New: val, Val: i} + default: + fmt.Println("未知类型") + return nil, fmt.Errorf("未知类型:" + k) + } + } + } + return changeMap, nil +}