在 Go 中通过反射创建结构

acl*_*kay 0 go

我想完全动态地定义一个结构体,这样我就可以得到下面的结构体,但不先定义它?

type Data struct {
   a string
   b int `json:"b"`
}
d := Data{}
Run Code Online (Sandbox Code Playgroud)

ase*_*thi 5

应用程序可以使用reflect.StructOf以编程方式创建结构,但必须导出结构中的所有字段。

问题将结构作为一个值,但很可能指向结构的指针对应用程序更有用。

鉴于上述情况,此答案显示了如何在编译时不定义类型的情况下执行以下操作:

type Data struct {
   A string `json:"a"`
   B int `json:"b"`
}
var d interface{} = &Data{}
Run Code Online (Sandbox Code Playgroud)

代码是:

t := reflect.StructOf([]reflect.StructField{
    {
        Name: "A",
        Type: reflect.TypeOf(int(0)),
        Tag:  `json:"a"`,
    },
    {
        Name: "B",
        Type: reflect.TypeOf(""),
        Tag:  `json:"B"`,
    },
})
d := reflect.New(t).Interface()
Run Code Online (Sandbox Code Playgroud)

这是一个设置一些字段的可运行示例:https : //play.golang.org/p/uik7Ph8_BRH