2017-03-15 117 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

這正是我正在尋找的。非常感激! –