添加any类型的值

This commit is contained in:
Yun
2024-10-28 21:37:58 +08:00
parent aece28fff2
commit becba13ed9
4 changed files with 61 additions and 4 deletions
+1 -1
View File
@@ -2,4 +2,4 @@ module code.yun.ink/pkg/structx
go 1.20
require code.yun.ink/pkg/convx v1.0.1
require code.yun.ink/pkg/convx v1.0.2
+2 -2
View File
@@ -1,2 +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=
code.yun.ink/pkg/convx v1.0.2 h1:vkEcDQ8w9Kz2T/RMnYefkzyXQwqI9nnaWo+Z1jlS7IE=
code.yun.ink/pkg/convx v1.0.2/go.mod h1:6xqmUend1kwarRvJ0TQlfzzS4QCWdRrXQiUY/ggzYqo=
+27 -1
View File
@@ -5,6 +5,7 @@ import (
"reflect"
"strconv"
"strings"
"code.yun.ink/pkg/convx"
)
@@ -14,6 +15,24 @@ type ChangeInfo struct {
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的数据赋值到结构体中
func AttactToStruct(structxx interface{}, updateMap map[string]string) (map[string]ChangeInfo, error) {
// 将结构体指针转换为reflect.Value类型
@@ -44,7 +63,14 @@ func AttactToStruct(structxx interface{}, updateMap map[string]string) (map[stri
if field.IsValid() && field.CanSet() {
// 根据字段的类型进行类型转换和赋值
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:
// 将字符串转换为int64
oldi := field.Int()
+31
View File
@@ -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"`
}