使用go中的字符串通过名称实例化结构

时间:2014-01-04 03:16:49

标签: go

我正在尝试创建一个函数,该函数采用[]byteinterface{}(代表struct)并返回interface{}作为struct类型传递到func

这样的事情:

package main

import (

"encoding/json"

)


func UnmarshalFromJSONArray(sms []byte,tt string) (interface{}) {
    var ts = new(tt) 
    err := json.Unmarshal(sms,&ts)
    if(err != nil) {
        fmt.Println(err)
    }
    return sms
}

因此该方法将运行如下:

// let's say a struct has the following definition:

type MyStructType struct {
    Id int
    Name string
    Desc string
}

// we can some how get its fully qualified class name (this may require reflection?) or pass it into the UnMarshal method direction some how.
mst := "package.MyStructType",

// and then assume a byte array ba that has JSON format for 

ba := []byte(`{"Id":"3","Name":"Jack","Desc":"the man"}`)

stct := UnmarshalFromJSONArray(ba,mst)

MyStructureType out := stct

// leaving "stct" being the unmarshalled byte array which can be used like any other struct of type "MyStructureType"

关键是在解组前我永远不需要知道MyStructureType的字段是什么。我需要的只是struct的名称和实例之一,然后使用与其字段匹配的JSON字节数组数据填充它。希望这是可能的(在使用反射的java中这是微不足道的)。所以我想基本上用它的名字解组匿名struct类型,而不需要知道它有哪些字段。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

简短的回答是,这是不可能的。在Go中没有要键入翻译器的字符串。您可以创建一个字符串映射来反映.Type,但您需要提前知道可能的选项,或者您需要为调用者提供一种注册类型的方法(可能在init中)。

假设您已找到一种方法将字符串解析为其reflect.Type,您只需调用reflect.New(typ).Interface()即可获取需要传递给json.Unmarshal()的指针。

最好的答案是避免一起尝试这一切。在Go中编写惯用Java实际上是不可能的。如果我对你的问题了解得更多,我可以给你一个更惯用的Go解决方案。