在Go语言中,通过反射机制将结构体序列化成map[string]interface{}类型
import "reflect"
func structToMap(obj interface{}) map[string]interface{} {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
// 如果obj不是结构体类型,则返回空map
if t.Kind() != reflect.Struct {
return nil
}
// 定义map
data := make(map[string]interface{})
// 遍历结构体字段
for i := 0; i < t.NumField(); i++ {
// 获取字段名和值
key := t.Field(i).Name
value := v.Field(i).Interface()
// 将字段名和值存入map中
data[key] = value
}
return data
}
该回答引用GPT:
在Go语言中,可以通过反射机制将结构体序列化成map[string]interface{}类型。例如:
type User struct {
Name string
Age int
}
user := User{Name: "John", Age: 20}
m := make(map[string]interface{})
val := reflect.ValueOf(user)
for i := 0; i < val.NumField(); i++ {
m[val.Type().Field(i).Name] = val.Field(i).Interface()
}
fmt.Println(m) // map[Name:John Age:20]
如还有疑问,可留言帮助解决。
不知道你这个问题是否已经解决, 如果还没有解决的话:首先,我们可以将它们转化为 json 字符串来比较即可,但是因为Map是无序的,所以转化的json字符串不一定会一模一样。(当然,你也可以用反射来做,但是代码量多,麻烦。)
所以我们可以将其转化成顺序一样的 slice ,然后再转化未 json 。 这样就确保的json可以一样了。
代码如下:
func CompareTwoMapInterface(data1 map[string]interface{},
data2 map[string]interface{}) bool {
keySlice := make([]string, 0)
dataSlice1 := make([]interface{}, 0)
dataSlice2 := make([]interface{}, 0)
for key, value := range data1 {
keySlice = append(keySlice, key)
dataSlice1 = append(dataSlice1, value)
}
for _, key := range keySlice {
if data, ok := data2[key]; ok {
dataSlice2 = append(dataSlice2, data)
} else {
return false
}
}
dataStr1, _ := json.Marshal(dataSlice1)
dataStr2, _ := json.Marshal(dataSlice2)
return string(dataStr1) == string(dataStr2)
}