如何在golang中创建将json字符串转换为结构的通用函数?

如何在golang中创建将json字符串转换为结构的通用函数?,json,function,go,interface,Json,Function,Go,Interface,首先,我有以下结构: type User struct { Username string Password string FullName string Mail string } 我尝试创建以下函数: func FromJson(emptyJsonAble interface{},jsonString string) interface{} { err := json.Unmarshal([]byte(jsonString), &emptyJ

首先,我有以下结构:

type User struct {
    Username string
    Password string
    FullName string
    Mail string
}
我尝试创建以下函数:

func FromJson(emptyJsonAble interface{},jsonString string) interface{} {
    err := json.Unmarshal([]byte(jsonString), &emptyJsonAble)
    if err != nil {
        panic(err)
    }
    return emptyJsonAble
}
我已按以下方式调用该函数:

user := FromJson(User{}, str)
但函数返回以下映射,而不是用户结构:

map[全名:a邮件:a密码:b用户名:a]

如何返回结构本身(无需每次转换返回的对象)

P>换句话说,如何使函数在给定时考虑用户类型。
我曾尝试使用reflect.Type,但我被卡住了

当您传递用户结构时,实际上是在传递一个值的副本,在您的场景中,您要做的是传递一个指向该类型的指针引用。然后,因为您已经有了指针,所以不需要在函数内部通过引用传递:

func FromJson(emptyJsonAble interface{},jsonString string) interface{} {
    err := json.Unmarshal([]byte(jsonString), &emptyJsonAble)
    if err != nil {
        panic(err)
    }
    return emptyJsonAble
}
user:=FromJson(&user{},str)

err:=json.Unmarshal([]字节(jsonString),emptyJsonAble)

更新:

同样,由于您现在是通过引用传递的,因此不需要返回解组数据结构的副本:


在这两种情况下,我们可以看到结果是相同的,因此数据的返回是不必要的

json。Unmarshal
已经是实现这一点的函数,并且它是唯一合理的方法-通过使用指向要反序列化的值的指针。你想用包装函数来改变这种行为吗?因为我想避免重复那些代码行,包括将jsonString转换为字节数组,所以请删除返回值和返回语句,并使用与使用
json.Unmarshal
相同的方法。非常感谢!我将函数改为返回error而不是interface,因为它已经在EmptyJSO指针内创建了对象