Maison  >  Article  >  développement back-end  >  Comment intégrer des interfaces Go dans des modèles MongoDB à l'aide de mgo ?

Comment intégrer des interfaces Go dans des modèles MongoDB à l'aide de mgo ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 03:12:27926parcourir

 How Can You Embed Go Interfaces in MongoDB Models Using mgo?

Intégration d'interfaces dans des modèles MongoDB avec mgo

Lorsque vous travaillez avec un système de workflow qui implique des nœuds de différents types, il est courant d'utiliser des interfaces Go pour représenter les différents types de nœuds. Cependant, cette approche présente un défi lors du stockage de ces workflows dans MongoDB à l'aide de mgo.

Considérons l'exemple suivant :

<code class="go">type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []Node
}

type Node interface {
  Exec() (int, error)
}</code>

Où Node est une interface avec une seule méthode, Exec() qui peut être implémenté par différents types de nœuds.

Pour stocker un workflow dans MongoDB, vous pouvez tenter de le trouver par ID :

<code class="go">w = &Workflow{}
collection.FindID(bson.ObjectIdHex(id)).One(w)</code>

Cependant, vous rencontrerez une erreur car mgo ne peut pas annuler le marshal Interfaces Node intégrées directement dans une structure Go. En effet, il lui manque les informations de type nécessaires pour créer le type concret approprié pour chaque nœud.

Pour résoudre ce problème, vous pouvez définir une structure qui contient explicitement à la fois le type de nœud et la valeur réelle du nœud :

<code class="go">type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}</code>

En utilisant bson:"-", le sous-champ Node est exclu du décodage automatique et est plutôt géré manuellement dans la fonction SetBSON :

<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error {
    // Decode the node type from the "Type" field
    // Create a new instance of the concrete node type based on the decoded type
    // Unmarshal the remaining document into the concrete node type
    //...
}</code>

Cette approche permet à mgo d'identifier le type de chaque nœud et créez l'instance concrète appropriée pendant le décodage, résolvant ainsi le problème d'informations de type.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn