Je travaille sur une mise en œuvre du module Go à une communication abstraite avec d'autres pairs. L'idée derrière le module consiste à envoyer / recevoir des messages via un MQ dans un format de message standard pouvant transporter pratiquement n'importe quel type d'entités. Mais je trouve très difficile de résoudre la conversion de type en déplacement.
Voici un extrait de ce que j'essaie de faire ( https://play.golang.org/p/orb1vnduly1 ). P>
cart = message.Entity.(Cartoon)
3 Réponses :
Il y a une solution (ce n'est pas si élégant!), si vous gardez la structure sans modifications.
tmp, ok := message.Entity.(map[string]interface{})
if ok {
cart.Name = tmp["Name"].(string) // inside bracket depends to the json
cart.Show = tmp["Show"].(string)
}
on dirait que je peux résoudre ce problème avec une libéie appelée Mapstructure.
var cart Cartoon
mapstructure.Decode(message.Entity, &cart)
fmt.Println("cartoon:", cart)
Ce n'est pas différent d'utiliser JSON.RawMessage et JSON.UNMARSHAL, sauf que cela obligeait une dépendance à vos utilisateurs et qu'ils utilisent des balises non standard dans leurs types, ce qui n'est pas possible si les types sont définis dans un package tiers.
La question demande comment convertir une interface Si le type est connu à l'époque, le JSON est non maculé, puis réglez le champ d'entité sur un pointeur sur une valeur du type approprié: P> {} code> pour aller taper. L'objectif de niveau supérieur de l'application OPS est de convertir la variante partie d'un message JSON à un type de Go. Le problème de niveau supérieur est répondu ici. var entity json.RawMessage
message := &Message{Entity: &entity}
err = json.Unmarshal(payload, message)
if err != nil {
// handle error
}
message.Entity = nil
if t := messageTypes[message.Type]; t != nil {
v := reflect.New(t).Interface()
err := json.Unmarshal(entity, v)
if err != nil {
// handle error
}
message.Entity = v
}
Soit définir le champ d'entité sur une valeur du type de béton avant la montagne ou utilisez JSON.RawMessage < / a> au lieu de la chaîne. Il existe pour exactement ce cas d'utilisation.
Comment le type cible est-il déterminé? Un champ dans le message spécifie-t-il le type ou est déterminé par la fonction appelée?
En fait, dans le module approprié, je travaille sur, il existe un champ qui dit le nom de type (chaîne). Mais seule l'application Consumer saura / avoir ce type. La lib ne sait pas à ce sujet. Donc, la fonction appelée arrivera à le savoir.