Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| becba13ed9 |
@@ -2,4 +2,4 @@ module code.yun.ink/pkg/structx
|
|||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require code.yun.ink/pkg/convx v1.0.1
|
require code.yun.ink/pkg/convx v1.0.2
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
code.yun.ink/pkg/convx v1.0.1 h1:T6yIVqyC1nQc9CO0C7iHn5rs7GxbaulmrJtxwg95q9Y=
|
code.yun.ink/pkg/convx v1.0.2 h1:vkEcDQ8w9Kz2T/RMnYefkzyXQwqI9nnaWo+Z1jlS7IE=
|
||||||
code.yun.ink/pkg/convx v1.0.1/go.mod h1:6xqmUend1kwarRvJ0TQlfzzS4QCWdRrXQiUY/ggzYqo=
|
code.yun.ink/pkg/convx v1.0.2/go.mod h1:6xqmUend1kwarRvJ0TQlfzzS4QCWdRrXQiUY/ggzYqo=
|
||||||
|
|||||||
+27
-1
@@ -5,6 +5,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.yun.ink/pkg/convx"
|
"code.yun.ink/pkg/convx"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,6 +15,24 @@ type ChangeInfo struct {
|
|||||||
Val interface{} `json:"val"`
|
Val interface{} `json:"val"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// map[string]interface类型的值附加到结构体中
|
||||||
|
func AttactToStructAny(structxx interface{}, updateMap map[string]interface{}) (map[string]ChangeInfo, error) {
|
||||||
|
m := map[string]string{}
|
||||||
|
for k, v := range updateMap {
|
||||||
|
str, err := convx.ToString(v)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
m[k] = str
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt.Println("bef", m, structxx)
|
||||||
|
|
||||||
|
r, err := AttactToStruct(structxx, m)
|
||||||
|
// fmt.Println("resp:", r, m, structxx)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
// 这个方法将map的数据赋值到结构体中
|
// 这个方法将map的数据赋值到结构体中
|
||||||
func AttactToStruct(structxx interface{}, updateMap map[string]string) (map[string]ChangeInfo, error) {
|
func AttactToStruct(structxx interface{}, updateMap map[string]string) (map[string]ChangeInfo, error) {
|
||||||
// 将结构体指针转换为reflect.Value类型
|
// 将结构体指针转换为reflect.Value类型
|
||||||
@@ -44,7 +63,14 @@ func AttactToStruct(structxx interface{}, updateMap map[string]string) (map[stri
|
|||||||
if field.IsValid() && field.CanSet() {
|
if field.IsValid() && field.CanSet() {
|
||||||
// 根据字段的类型进行类型转换和赋值
|
// 根据字段的类型进行类型转换和赋值
|
||||||
switch field.Kind() {
|
switch field.Kind() {
|
||||||
// convx.
|
case reflect.Bool:
|
||||||
|
oldb := field.Bool()
|
||||||
|
olds, _ := convx.ToString(oldb)
|
||||||
|
|
||||||
|
b, _ := convx.ToBool(val)
|
||||||
|
field.SetBool(b)
|
||||||
|
|
||||||
|
changeMap[k] = ChangeInfo{Old: olds, New: val, Val: b}
|
||||||
case reflect.Int64:
|
case reflect.Int64:
|
||||||
// 将字符串转换为int64
|
// 将字符串转换为int64
|
||||||
oldi := field.Int()
|
oldi := field.Int()
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package structx_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.yun.ink/pkg/structx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAttactToStructMap(t *testing.T) {
|
||||||
|
|
||||||
|
m := make(map[string]interface{})
|
||||||
|
m["name"] = "Tom"
|
||||||
|
m["age"] = 18
|
||||||
|
m["is_man"] = true
|
||||||
|
fmt.Println(m)
|
||||||
|
|
||||||
|
d := Data{}
|
||||||
|
|
||||||
|
r, err := structx.AttactToStructAny(&d, m)
|
||||||
|
|
||||||
|
fmt.Printf("%+v %+v %+v", d, r, err)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Age int `json:"age"`
|
||||||
|
IsMan bool `json:"is_man"`
|
||||||
|
Addr string `json:"addr"`
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user