Go - Обход вложенных структур - PullRequest
1 голос
/ 09 июля 2020

У меня сложная структура такого рода:

type InFoo struct {
    v3 int
}
type Bar struct {
    v1 int
    v2 InFoo
}
type Foo struct {
    A int
    B string
    C Bar
}

Во время выполнения это может быть еще более глубоко вложенным. Ниже я написал функцию для обхода полей, как показано ниже:

func main() {
    f := Foo{A: 10, B: "Salutations", C: Bar{v1: 10, v2: InFoo{v3: 20}}}
    fType := reflect.TypeOf(f)
    newexaminer(fType)
}

// recursive traversal
func newexaminer(t reflect.Type) {
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        fmt.Println(f.Name, f.Type.Kind(), f.Type)
        if f.Type.Kind() == reflect.Struct {
            // recurse if struct
            newexaminer(f.Type)
        }

    }
}

Хотя это работает, но я не уверен, есть ли лучший / оптимизированный способ сделать это. Пожалуйста, предложите!

  • РЕДАКТИРОВАТЬ: 1 На основании комментариев я изменил подход к:
func main() {
    f := Foo{A: 10, B: "Salutations", C: Bar{v1: 10, v2: InFoo{v3: 20}}}
    jsonRes, err := json.Marshal(f)
    if err != nil {
        fmt.Println(err)
    }

    var iRes interface{}

    err = json.Unmarshal(jsonRes, &iRes)
    if err != nil {
        fmt.Println(err)
    }
    res := iRes.(map[string]interface{})

    for _, v := range res {

        fmt.Println(v)
        // need to type assert v again to extract map keys/values
    }
} 

Детская площадка: https://play.golang.org/p/_TXrRGxpIyx

Является ли это idomati c способом обхода структур. Похоже, что для доступа к большинству внутренних полей по-прежнему потребуется несколько утверждений и циклов. Это идеальный подход для анализа сложного json документа или есть лучший способ сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...