Réflexion Golang: obtenir la balise du champ struct

Est-il possible de réfléchir à un champ d'une structure, et obtenir une référence à ses valeurs de balise?

Par exemple:

type User struct {
    name    string `json:name-field`
    age     int
}
...
user := &User{"John Doe The Fourth", 20}
getStructTag(user.name)
...
func getStructTag(i interface{}) string{
   //get tag from field

}

D'après ce que je peux voir, la façon habituelle de le faire est de dépasser typ.NumField (), puis appelez field.Balise.Get("tag"). Cependant, dans mon cas d'utilisation, il serait préférable de ne pas avoir à passer toute la structure. Des idées?

21
demandé sur Jameo 2014-05-07 05:06:15

1 réponses

Vous n'avez pas besoin de passer la structure entière, mais passer la valeur de l'un des champs n'est pas suffisant. Dans votre exemple user.name est juste un string - le paquet reflect n'aura aucun moyen de le corréler à la structure d'origine.

Au lieu de cela, vous devez passer autour du reflect.StructField pour le champ donné:

field, ok := reflect.TypeOf(user).Elem().FieldByName("name")
…
tag = string(field.Tag)

Voir http://play.golang.org/p/G6wxUVVbOw

(notez que nous utilisons Elem ci-dessus car user est un pointeur vers une structure).

40
répondu djd 2014-05-07 02:43:44