У меня сложная структура такого рода:
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 документа или есть лучший способ сделать это