go中Struct转map,map转Struct的测试
go中Struct转map,map转Struct的测试
package main
import (
"fmt"
"github.com/mitchellh/mapstructure"
"reflect"
"time"
)
func main() {
type Info struct {
Addr string `json:"addr" mapstructure:"addr"`
}
type User struct {
UserName string `json:"user_name" mapstructure:"user_name"`
Info Info `json:"info" mapstructure:"info"`
Time time.Time `json:"time" mapstructure:"time"`
}
user := User{
UserName: "u1",
Info: Info{
Addr: "a1",
},
Time: time.Now(),
}
// 测试使用 mapstructure 库将 Struct 转为 map,时间的转换会有问题
var msUserMap map[string]interface{}
_ = mapstructure.Decode(user, &msUserMap)
fmt.Printf("%#v\n", msUserMap)
// 测试使用反射将 Struct 转为 map,但只是单层,Info仍然是结构体
userMap := StructToMap(user)
fmt.Printf("%#v\n", userMap)
// 将 map 转为 Struct
var u1 User
_ = mapstructure.Decode(userMap, &u1)
fmt.Printf("%#v\n", u1)
}
func StructToMap(obj interface{}) map[string]interface{} {
obj1 := reflect.TypeOf(obj)
obj2 := reflect.ValueOf(obj)
data := make(map[string]interface{})
for i := 0; i < obj1.NumField(); i++ {
if obj1.Field(i).Tag.Get("mapstructure") != "" {
data[obj1.Field(i).Tag.Get("mapstructure")] = obj2.Field(i).Interface()
} else {
data[obj1.Field(i).Name] = obj2.Field(i).Interface()
}
}
return data
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南