2016-09-22 1 views
-2

J'ai un tableau d'interfaces comme ceci:Dump un tableau d'interfaces dans golang

type Test struct { 
    Name string 
} 

func main() { 
    result := []Test{ 
     Test{Name: "ahmad"}, 
     Test{Name: "reza"}, 
    } 
    dump(result) 
} 

Comment puis-je vider ce tableau et de faire une chaîne comme ceci:


Nom

ahmad

reza


Je veux quelque chose comme this mais avec des tableaux.

Mise à jour

Je ne veux pas vider l'interface de test ...

Je veux vider toutes les interfaces.

package main 

import (
    "fmt" 
    "reflect" 
) 

type Test struct { 
    Name string 
} 

func main() { 
    result := []Test{ 
     Test{Name: "ahmad"}, 
     Test{Name: "reza"}, 
    } 
    dump(result) 
} 

func dump(datasets interface{}) { 
    items := reflect.ValueOf(datasets) 
    if items.Kind() == reflect.Slice { 
     for i := 0; i < items.Len(); i++ { 
      item := items.Index(i) 
      if item.Kind() == reflect.Struct { 
       s := reflect.ValueOf(item) 
       t := reflect.TypeOf(item) 
       for j := 0; j < s.NumField(); j++ { 
        fmt.Println(t.Field(j).Name) 
       } 
      } 
     } 
    } 
} 

Quelque chose comme ceci. Mais le résultat est:

typ 
ptr 
flag 
typ 
ptr 
flag 

Comment puis-je changer sortie:

Name 
Name 
+1

Vous avez un tableau d'objets 'Test', avez-vous vraiment besoin de traiter ces éléments comme une interface?Dans votre échantillon, ce n'est certainement pas nécessaire, mais c'est juste un exemple, donc une clarification serait utile. Si cela est vraiment représentatif de votre code, vous devriez 100% faire 'result [i] .Name' et ne pas toucher à la réflexion ou aux interfaces du tout. – evanmcdonnal

+0

@evanmcdonnal L'objet Test est juste pour l'échantillon. Je ne sais pas quelle interface va passer à la fonction de vidage. – ahmdrz

Répondre

0

Votre exemple pourrait vraiment utiliser plus de détails, mais voici ma meilleure tentative de vous aider basé ce que vous avez fourni. Je suppose que la définition de la décharge est la suivante;

func dump(items []interface{}) 

Et que vous êtes à la recherche spécifiquement pour imprimer le champ Name sur tout ce qui est transmis, plutôt que de dire l'impression de tous les champs sur un objet passé dans

func dump(items []interface{}) { 
    fmt.Println("Name") 
    for i := 0; i < len(items); i++ { 
      v := reflect.ValueOf(items[i]) 
      name := v.FieldByName("Name") 
      fmt.Println(name.String()) 
    } 
} 

Travailler ici par exemple. https://play.golang.org/p/zUBt6qkuok

Si vous souhaitez plutôt imprimer tous les champs pouvant être modifiés avec des modifications mineures. Ajoutez juste une autre boucle à l'intérieur de ceci où vous itérez sur j < v.NumField() et employez v.Field(i) pour obtenir chaque champ qui est là. Il y a beaucoup de façons de structurer votre code à ce niveau en fonction de ce que vous voulez (comme si vous voulez imprimer FieldName1 suivi de ses valeurs puis FieldName2 suivi de ses valeurs ect alors votre code serait très différent de si vous n'étiez pas y compris les en-têtes ou en imprimant chaque champ sur l'instance en cours l'un après l'autre). Mais ce sont des détails que vous devrez vous soucier de vous-même ou spécifier dans une mise à jour à votre question. Bonne lecture sur le sujet ici; https://blog.golang.org/laws-of-reflection

Egalement les documents contenant les paquets reflètent sont assez utiles.

+0

Lire les notes mises à jour sur la question. Si je sais quelle interface passera à vider ce qui était très simple. Je ne sais rien de l'interface qui passe à fonctionner. – ahmdrz

0

Je trouve un moyen!

package main 

import (
    "fmt" 
    "reflect" 
) 

type Test struct { 
    Name string 
} 

func main() { 
    result := []Test{ 
     Test{Name: "ahmad"}, 
     Test{Name: "reza"}, 
    } 
    dump(result) 
} 

func dump(datasets interface{}) { 
    items := reflect.ValueOf(datasets) 
    if items.Kind() == reflect.Slice { 
     for i := 0; i < items.Len(); i++ { 
      item := items.Index(i) 
      if item.Kind() == reflect.Struct { 
       v := reflect.Indirect(item) 
       for j := 0; j < v.NumField(); j++ { 
        fmt.Println(v.Type().Field(j).Name, v.Field(j).Interface()) 
       } 
      } 
     } 
    } 
} 

https://play.golang.org/p/JUAnVoSAwc

Merci.

+0

https://github.com/ahmdrz/godumper – ahmdrz