递归扩展struct定义?

时间:2017-03-15 19:45:48

标签: go reverse-engineering

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

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
    }
}

context:逆向工程现有代码。

1 个答案:

答案 0 :(得分:2)

你可以尝试沿着这些行列出结构中定义的所有字段,递归地列出在路上找到的结构。

它不会产生您要求的输出,但它非常接近并且可能适合这样做。

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