Schnittstelle als Modell in Mgo (Go): Beheben des Zuweisbarkeitsfehlers
Beim Umgang mit Workflows, die Knoten unterschiedlichen Typs umfassen, kann dies der Fall sein Es ist verlockend, Golang-Schnittstellen zu nutzen, um ihre unterschiedlichen Verhaltensweisen zu kapseln. Das Speichern solcher Arbeitsabläufe in MongoDB stellt jedoch eine einzigartige Herausforderung dar.
Das Problem der Zuweisung
Der beim Suchvorgang aufgetretene Fehler ist auf die Inkompatibilität zwischen dem dekodierten Dokument und dem Dokument zurückzuführen Knotenschnittstelle. Mgo fehlen die Typinformationen, die erforderlich sind, um den spezifischen Typ jedes eingebetteten Knotens zu bestimmen. Dies führt zu einer Zuordnungsinkongruenz.
Alternativer Ansatz: Einbetten mit Typinformationen
Um diese Hürde zu überwinden, sollten Sie erwägen, die Typinformationen innerhalb der eingebetteten Knoten zu kapseln. Definieren Sie eine neue Struktur, NodeWithType, die aus der Node-Schnittstelle und einem Typfeld besteht, das den spezifischen Typ darstellt.
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
Benutzerdefiniertes BSON-Unmarshaling
Um die Lücke zwischen dem dekodierten Dokument und der Go-Struktur zu schließen, implementieren Sie die SetBSON-Funktion für NodeWithType. Diese Funktion dekodiert das Typfeld, erstellt eine Instanz des entsprechenden Typs und delegiert das Unmarshaling an ihn.
func (nt *NodeWithType) SetBSON(r bson.Raw) error {
// Decode Type field
var typeName string
err := bson.Unmarshal(r["Type"], &typeName)
if err != nil {
return err
}
// Create an instance of the correct type based on Type field
var node Node
switch typeName {
case "EmailNode":
node = &EmailNode{}
case "TwitterNode":
node = &TwitterNode{}
}
// Unmarshal the remaining fields into the created instance
if err = node.SetBSON(r[typeName]); err != nil {
return err
}
// Assign the created instance to the Node field
nt.Node = node
return nil
}
Ersetzen Sie in der Workflow-Struktur den Node-Slice durch einen Slice von NodeWithType.
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
Mit diesem Ansatz kann Mgo nun erfolgreich Workflows mit eingebetteten Knoten unterschiedlichen Typs finden und entmarshalieren.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3