【发布时间】:2018-02-23 14:10:41
【问题描述】:
我有一个嵌套的三层结构。 我想在 Go 中使用反射来解析它(使用递归函数)。使用反射和递归函数的原因是
- 可以有不同数量的字段(但前两个字段是固定的)
- 字段类型不固定。
- 嵌套层数可以不同(在本例中只有三层。可以更多)
这里有一些代码。
type Edge struct{
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Read Article `json:"visited,omitempty"`
}
type Article struct {
Uid string`json:"uid,omitempty"`
Namestring`json:"name,omitempty"`
From Site `json:"from,omitempty"`
}
type Site struct{
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
}
func CheckNestedStruct(edges interface{}){
rv := reflect.ValueOf(edges).Elem()
uidField := rv.FieldByName("Uid")
uid := getStructField(edges, "Name") // get value of Name from database
if (uid != ""){
uidField.SetString(uid)
}
for i := 0 ; i < rv.NumField() ; i++ {
field := rv.Field(i)
fieldType := field.Kind()
if (fieldType == reflect.Struct){
CheckNestedStruct(field)
}
}
}
func main(){
....
var edges Edges{
...
...
}
CheckNestedStruct(&edges)
}
当我运行它时,在第一层我得到了“type: *entity.SacWebIS”。但是,在第二次迭代/递归中,我得到了 "type: *reflect.rtype" 。
我也试过field.Interface()。
如何修改此代码?
谢谢。
更新
解决办法是
CheckNestedStruct(dg, field.Addr().Interface())
【问题讨论】:
-
上传纯代码。
-
谢谢。全部。我找到了答案。应该是 CheckNestedStruct(field.Addr().Interface())
标签: go struct reflection recursive-datastructures