我有一个嵌套的三层结构。 我想在 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/