2017-04-14 38 views
2

假設我有用某種yaml文件編寫的數據模型。使用反射的運行時結構

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

我想分析它,併產生結構:

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

是否有可能使用反射來生成運行時轉到結構?

+0

如果你理解C++,看看我的問題的答案[這裏](http://stackoverflow.com/questions/37701382/checking-ahead-for-future-groups-when-parsing-tokens )。我不知道Go,但是由於語言一直在生成,所以最好的辦法是定義一個詞法分析器,分析器和代碼生成器,它輸出Go,然後*使用反射生成的代碼。 – finnrayment

+0

@JimB將文件解析爲Go字符串並對其進行反射? – finnrayment

+0

由於@JimB已經提到你不能在** runtime **生成類型,但是你可以在go生成工具的幫助下生成代碼。在這裏看到更多:https://blog.golang.org/generate – mkopriva

回答

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

但正如其他人所說,有時最好只生成代碼。有時候反射會有些不可思議,並且在使用時需要很高的精度。