Comment obtenir la valeur sous-jacente à partir d'une réflexion.Valeur dans golang?
Donc j'ai trouvé un code qui m'aider à obtenir commencé avec la réflexion dans l'Aller (golang), mais je vais avoir du mal à obtenir une de la valeur sous-jacente, de sorte que je peux créer un map[string]string
à partir d'un struct et les champs.
Finalement, je tiens à rendre le résultat dans un map[string]interface{}
, mais cette question est gentil de me bloque.
Le code que j'ai en ce moment:
package main
import (
"fmt"
"reflect"
)
type Foo struct {
FirstName string `tag_name:"tag 1"`
LastName string `tag_name:"tag 2"`
Age int `tag_name:"tag 3"`
}
func inspect(f interface{}) map[string]string {
m := make(map[string]string)
val := reflect.ValueOf(f).Elem()
for i := 0; i < val.NumField(); i++ {
valueField := val.Field(i)
typeField := val.Type().Field(i)
f := valueField.Interface()
val := reflect.ValueOf(f)
m[typeField.Name] = val.String()
}
return m
}
func dump(m map[string]string) {
for k, v := range m {
fmt.Printf("%s : %s\n", k, v)
}
}
func main() {
f := &Foo{
FirstName: "Drew",
LastName: "Olson",
Age: 30,
}
a := inspect(f)
dump(a)
}
La sortie de l'exécution du code:
FirstName : Drew
LastName : Olson
Age : <int Value>
Ce que je comprends de la sortie pour FirstName et LastName sont réels réfléchir.Des objets de valeur, mais pour les chaînes de la Chaîne de caractères() la méthode de la valeur juste sorties de la sous-jacentes de la Chaîne. J'aimerais obtenir de l'int et la transformer en une chaîne de caractères, mais à partir de la relfect de la documentation du paquet, je ne suis pas tout de suite à voir comment c'est fait.
Soo.... Comment puis-je obtenir la valeur sous-jacente à partir d'une réflexion.Valeur dans golang?
- Un printf de
reflect.Value
va (Aller 1.5) impression de sa valeur réelle. Voir ma réponse ci-dessous - cool, merci pour votre aide, réussi enfin à obtenir la valeur avec l'aide de la fmt, comme vous l'avez suggéré: goplay.espace/#w98PfGoZHl8
- l'exécution de la solution avec le nom du champ, le type, la valeur et la balise: goplay.espace/#15XAsJBH5Sb
- Bien fait. (Et je n'étais pas au courant de goplay.l'espace, par la voie: il semble à portée de main)
Vous devez vous connecter pour publier un commentaire.
Un bon exemple de la façon d'analyser les valeurs est la
fmt
paquet. Voir ce code.En utilisant le code mentionné pour correspondre à votre problème devrait ressembler à ceci:
Fondamentalement, vous avez besoin de vérifier pour tous les Sortes disponibles.
reflect.Int
type de pensée quereflect.Int32
couvrirait que. Une fois, j'ai ajouté ce cas, si les choses ont mieux fonctionné.Int
est de type plate-forme de charge (mais au moins 32 bits) oùInt32
etInt64
ont des dimensions fixes.On dirait que vous êtes sur la bonne voie. Le problème que je vois avec votre code est-il fait des hypothèses sur les valeurs, du sens de le faire lorsque vous appelez
Elem()
et combien de fois (pour résoudre les pointeurs). Pour le savoir il faut regarder lareflect.Kind
. Est la valeur d'unreflect.Ptr
? Ensuite, utilisezElem()
.Une fois que vous avez la valeur de
val.Interface()
/val.String()
/val.Int()
vous pouvez convertir vos valeurs en tant que de besoin. Ce que vous utilisez va dépendre de l'reflect.Kind
. Pour convertir unint
vers/à partir destring
vous devez utiliser lestrconv
paquet.La
encoding/json
etencoding/xml
packages de faire ce genre de travail. Le code source fournit quelques grands exemples. Par exemple, jetez un oeil àcopyValue
dans encodage/xml/lire.aller etmarshalSimple
dans encodage/xml/maréchal.aller.Cela devrait être plus facile de le faire avec Go 1.5 (août 2015)
Voir examen 8731 et s'engager 049b89d par Rob Pike (
robpike
):Cela vous permettrait d'imprimer la valeur réelle d'un
Reflect.Value()
argument: