2017-03-15 12 views
2

ネストされたタイプを表示するために構造定義をどのように拡張できますか?再帰的に構造体定義を展開していますか?

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

がコンテキスト:既存のコードをリバースエンジニアリングたとえば、私はこのような何かにこの

type Foo struct { 
    x int 
    y []string 
    z Bar 
} 
type 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

これは私が探していたものです。とても有難い! –

関連する問題