使用反射的运行时结构

时间:2017-04-14 12:23:47

标签: go

假设我在某种yaml文件中编写了数据模型。

schema: human
type: object
properties:
    name:
        type: string
    surname:
        type: string

我想解析它,并生成结构:

type Human struct {
    Name string `db:"name"`
    Surname string `db:"surname"`
}

是否可以使用反射生成运行时Go结构?

1 个答案:

答案 0 :(得分:2)

是的,您可以使用reflect.StructOf

sType := reflect.StructOf([]reflect.StructField{
    {Name: "Name", Type: stringType, Tag: reflect.StructTag(`db:"name" json:"name"`)},
    {Name: "Surname", Type: stringType, Tag: reflect.StructTag(`db:"surname" json:"surname"`)},
})
sv := reflect.New(sType)
svi := sv.Interface()
b, err := json.Marshal(svi)
fmt.Printf("%s %v", b, err)

打印

{"name":"","surname":""} <nil>

游乐场:https://play.golang.org/p/U4N3bbJ5n8

但正如其他人所说,有时最好只生成代码。反射有时候很不稳定,使用它时需要很多精确度。