繁体   English   中英

我正在尝试用 Golang 中的反射解析结构字段指针

[英]I'm trying to parse a struct field pointers with reflection in Golang

所以我想在结构中打印名称(它可以嵌套),所以我试图使用递归方法来做同样的事情,但我没有这样做。我粘贴了下面的代码,我得到以下错误“恐慌:反映:在零值上调用 reflect.Value.NumField”。 当它是一个平面层次结构时我能够做到这一点,但当它嵌套时失败。感谢任何帮助。我也使用了这篇文章“https://www.reddit.com/r/golang/comments/g254aa/parse_struct_field_pointers_with_reflection_in/”以供参考。 此外,该结构是从 protobuf 构建的,因此是 Ptr。

package main

import (
    "fmt"
    reflect "reflect"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}
func getFields(protoStructure interface{}) {
    val := reflect.ValueOf(protoStructure).Elem()
    // if val.Kind() == reflect.Ptr {
    // val = val.Elem()
    // }
    valNumFields := val.NumField()
    for i := 0; i < valNumFields; i++ {
        field := val.Field(i)
        fieldKind := field.Kind()
        varDescription := val.Type().Field(i).Tag.Get("description")
        // fieldKindStr := field.Kind().String()
        fieldName := val.Type().Field(i).Name
        // fieldTypeStr := field.Type().String()
        fmt.Println(fieldName, varDescription)
        if fieldKind == reflect.Ptr {
            rvAsserted := field
            getFields(rvAsserted.Interface())
            // fmt.Println(rvAsserted.Type().String())
        }
    }
    return
}
func main() {
    getFields(&DeviceEnv{})
}

编写一个以 reflect.Type 作为参数的函数。 递归指针和结构字段。

func getFields(t reflect.Type, prefix string) {
    switch t.Kind() {
    case reflect.Ptr:
        getFields(t.Elem(), prefix)
    case reflect.Struct:
        for i := 0; i < t.NumField(); i++ {
            sf := t.Field(i)
            fmt.Println(prefix, sf.Name)
            getFields(sf.Type, prefix+"  ")
        }
    }
}

像这样使用它:

getFields(reflect.TypeOf(&Example{}), "")

在操场上跑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM