Types d'interfaces comme modèles dans mgo (Go)
Problème :
Dans un scénario impliquant des workflows et des nœuds intégrés de différents types, l'utilisation d'une interface de modélisation de nœuds dans MongoDB avec mgo entraîne une erreur. L'erreur se produit car mgo ne peut pas désassembler les documents Node intégrés sans informations de type.
Solution :
Pour surmonter cette limitation, envisagez de définir une structure pour contenir à la fois le type Node et les informations de type associées :
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string }</code>
Dans la structure Workflow, utilisez un tableau de structures NodeWithType pour stocker les nœuds :
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
Pour décoder correctement les données, implémentez la fonction SetBSON sur NodeWithType :
<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error { // Decode the type string typeStr := r.String() // Create a new Node value based on the type string switch typeStr { case "EmailNode": nt.Node = &EmailNode{} case "TwitterNode": nt.Node = &TwitterNode{} default: return errors.New("Unknown node type") } // Unmarshal the remaining data to the Node value bsonBytes, err := bson.Marshal(r.Body) if err != nil { return err } return bson.Unmarshal(bsonBytes, nt.Node) }</code>
Cette approche permet à mgo de désorganiser correctement les nœuds intégrés, en fonction des informations de type stockées dans la structure NodeWithType.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!