2017-03-15 1 views
2

Comment développer une définition de structure pour afficher les types imbriqués? Par exemple, je voudrais étendre ceDéfinition de structure récursivement récursive?

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

à quelque chose comme ceci:

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

contexte: reverse engineering d'un code existant.

+1

Pour confirmer: lors de l'exécution, vous souhaitez générer la représentation du code source Go d'un certain type, l'expansion récursive les types de struct. Est-ce exact? –

+0

Pas nécessairement à l'exécution, bien que ce serait bien. J'ai des conteneurs de haut niveau, et je veux juste comprendre tout ce qui s'y passe. –

+2

Si vous voulez afficher la valeur, j'utilise souvent [spew] (https://godoc.org/github.com/davecgh/go-spew/spew). Si vous voulez parcourir les valeurs de la source, je passe directement à la définition de chaque type dans mon éditeur. – JimB

Répondre

2

Vous pouvez essayer quelque chose le long de ces lignes pour lister tous les champs définis dans une structure, en listant récursivement les structures trouvées dans le chemin.

Il ne produit pas exactement la sortie que vous avez demandée, mais il est assez proche et peut probablement être adapté pour le faire.

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

Je reçois cette sortie en raison de ce qui précède:

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

C'est exactement ce que je cherchais. Très appréciée! –