一尘不染

递归扩展结构定义?

go

如何扩展结构定义以显示嵌套类型?例如,我想扩展这个

type Foo struct {
  x int
  y []string
  z Bar
}
type Bar struct {
  a int
  b string
}

像这样:

type Foo struct {
  x int
  y []string
  z Bar
    struct {
      a int
      b string
    }
}

上下文:对现有代码进行逆向工程。


阅读 289

收藏
2020-07-02

共1个答案

一尘不染

您可以尝试按照以下方式进行操作,以列出结构中定义的所有字段,然后递归列出以这种方式找到的结构。

它不能完全产生您所要求的输出,但是非常接近,并且可以进行调整。

package main

import (
    "reflect"
    "fmt"
)

type Foo struct {
  x int
  y []string
  z Bar
}
type Bar struct {
  a int
  b string
}

func printFields(prefix string, t reflect.Type) {
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        fmt.Printf("%v%v %v\n", prefix, f.Name, f.Type)
        if f.Type.Kind() == reflect.Struct {
            printFields(fmt.Sprintf("  %v", prefix), f.Type)
        }
    }    
}

func printExpandedStruct(s interface{}) {
    printFields("", reflect.ValueOf(s).Type())
}

func main() {
    printExpandedStruct(Foo{})
}

由于上述原因,我得到了此输出:

x int
y []string
z main.Bar
  a int
  b string
2020-07-02