2017-03-15 83 views
2

如何扩展一个结构定义来显示嵌套类型?例如,我想扩大这个递归扩展结构定义?

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

方面:逆向工程现有的代码。

+1

要确认:在运行时,你想生成某种类型的围棋源代码表示,递归扩展结构类型。那是对的吗? –

+0

不一定在运行时,尽管这样可以。我有一些高层次的容器,我只想了解所有的东西。 –

+2

如果你想显示值,我经常使用[spew](https://godoc.org/github.com/davecgh/go-spew/spew)。如果你想浏览源代码中的值,那么我会在编辑器中跳到每种类型的定义。 – JimB

回答

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 
+0

这正是我正在寻找的。非常感激! –