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

확인하려면 :

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

나는이 위의 결과로 출력을 얻을 실행시에, 재귀 적 구조체 유형을 확대하고, 어떤 종류의 이동 소스 코드 표현을 생성하고 싶습니다. 그 맞습니까? –

+0

런타임에는 반드시 그런 것은 아니지만 괜찮습니다. 나는 몇 가지 고수준의 용기를 가지고 있으며, 단지 그것들에 들어있는 모든 것을 이해하고 싶습니다. –

+2

값을 표시하려면 [spew] (https://godoc.org/github.com/davecgh/go-spew/spew)를 자주 사용합니다. 소스의 값을 살펴보고 싶으면 편집기에있는 각 유형의 정의로 건너 뜁니다. – JimB

답변

2

구조체에 정의 된 모든 필드를 나열하기 위해이 라인을 따라 뭔가를 시도해 볼 수 있습니다. 반복적으로 발견 된 구조체를 나열합니다.

당신이 요청한 결과물을 정확히 만들어 내지는 못하지만 꽤 가까워서 그렇게 할 수 있습니다.

x int 
y []string 
z main.Bar 
    a int 
    b string 
+0

이것은 내가 찾고있는 것입니다. 매우 감사! –