J'essaie de créer une méthode générique dans Go qui remplira un en struct
utilisant les données d'un fichier map[string]interface{}
. Par exemple, la signature et l'utilisation de la méthode peuvent ressembler à ceci:
func FillStruct(data map[string]interface{}, result interface{}) {
...
}
type MyStruct struct {
Name string
Age int64
}
myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"] = 23
result := &MyStruct{}
FillStruct(myData, result)
// result now has Name set to "Tony" and Age set to 23
Je sais que cela peut être fait en utilisant JSON comme intermédiaire; y a-t-il une autre façon plus efficace de faire cela?
encoding/json
package stdlib pour faire cette étape intermédiaire. Pouvez-vous donner un exemple de carte et un exemple de structure sur lesquels cette méthode pourrait être utilisée?unsafe
package .. mais je n'ose pas l'essayer. Autre que cela .. Une réflexion est requise, car vous devez être en mesure d'interroger les métadonnées associées à un type afin de placer des données dans ses propriétés. Ce serait assez simple d'envelopper cela dansjson.Marshal
+json.Decode
calls .. mais c'est le double du reflet.Réponses:
Le moyen le plus simple serait d'utiliser https://github.com/mitchellh/mapstructure
Si vous voulez le faire vous-même, vous pouvez faire quelque chose comme ceci:
http://play.golang.org/p/tN8mxT_V9h
la source
func (s MyStr...) FillStruct ...
pour chacun. Est-il possible de définir FillStruct pour une structure de base, puis toutes mes autres structures `` héritent '' de ce comportement? Dans le paradigme ci-dessus, ce n'est pas possible car seule la structure de base ... dans ce cas "MyStruct" aura en fait ses champs itérésLa bibliothèque https://github.com/mitchellh/mapstructure de Hashicorp le fait hors de la boîte:
Le deuxième
result
paramètre doit être une adresse de la structure.la source
user_name
et la structure classée estUserName
?encoding/json
packagejuste par exemple:
la source
Vous pouvez le faire ... cela peut devenir un peu moche et vous serez confronté à des essais et des erreurs en termes de types de mappage ... mais voici l'essentiel:
Exemple de travail: http://play.golang.org/p/PYHz63sbvL
la source
reflect: call of reflect.Value.Set on zero Value
J'adapte la réponse de Dave et ajoute une fonction récursive. Je travaille toujours sur une version plus conviviale. Par exemple, une chaîne numérique dans la carte doit pouvoir être convertie en int dans la structure.
la source
Il y a deux étapes:
Voici un exemple:
la source