我正在尝试创建一个函数,该函数采用[]byte
和interface{}
(代表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
类型,而不需要知道它有哪些字段。
有什么建议吗?
答案 0 :(得分:4)
简短的回答是,这是不可能的。在Go中没有要键入翻译器的字符串。您可以创建一个字符串映射来反映.Type,但您需要提前知道可能的选项,或者您需要为调用者提供一种注册类型的方法(可能在init中)。
假设您已找到一种方法将字符串解析为其reflect.Type,您只需调用reflect.New(typ).Interface()即可获取需要传递给json.Unmarshal()的指针。
最好的答案是避免一起尝试这一切。在Go中编写惯用Java实际上是不可能的。如果我对你的问题了解得更多,我可以给你一个更惯用的Go解决方案。