go - Go中如何使用reflect递归解析嵌套结构?

标签 go struct reflection recursive-datastructures

我有一个嵌套的三层结构。 我想在 Go 中使用 reflect 来解析它(使用递归函数)。使用反射和递归函数的原因是

  • 可以有不同数量的字段(但前两个字段是固定的)
  • 字段类型不固定。
  • 嵌套层的数量可以不同(在这个例子中只有三层。它可以更多)

这里是一些代码。

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())

最佳答案

您正在 reflect.Value 上调用 reflect.ValueOf,它为您提供类型 *reflect.rtype。如果要将 reflect.Value 传回同一个函数,您需要先调用 Interface()

CheckNestedStruct(field.Interface())

然后无论您是在指针还是值上操作,您都在调用 Elem。如果你想有条件地间接一个值,使用 reflect.Indirect

rv := reflect.Indirect(reflect.ValueOf(edges))

关于go - Go中如何使用reflect递归解析嵌套结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48949737/

相关文章:

戈朗 : cgo extern is not working

c++ - for 循环初始化语句中的未命名结构声明

c# - 比较泛型 : A "master-type" IEnumerable<> that is generic, 但匹配所有特定类型(IEnumerable<int>、IEnumerable<object>、...)?

c# - C# 属性是否可以没有 GetMethod 和 SetMethod

c# - 如何制作 "as Class",其中 Class 是字符串名称?

go - 向 Docker 中的 Golang 应用程序发送信号

go - 我如何处理 goroutine 中的 panic ?

go - Beego框架-api项目-我可以在 Controller 文件夹中有文件夹结构吗

struct - 是否有将默认名称放入元组中以获得更好的代码完成和建议的功能?

c++ - 退出后代码崩溃?