在Go语言中,通过反射机制将结构体序列化成map[string]interface{}类型

在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]

如还有疑问,可留言帮助解决。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/1012936
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:golang中map并发读写问题及解决方法
  • 除此之外, 这篇博客: Go 语言中如何比较两个map[string]interface{}是否相等中的 那么如何比较两个map[string]interface{} 是否相等呢? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    首先,我们可以将它们转化为 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)
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^