-2
votes

Comment convertir d'une interface {} à une instance de structure

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 :


0
votes

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)
}


0 commentaires

0
votes

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)


1 commentaires

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.



3
votes

La question demande comment convertir une interface {} 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.

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>

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
}


0 commentaires