添加any类型的值
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
@@ -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