Interfaz como modelo en Mgo (Go): resolución del error de asignabilidad
Cuando se trata de flujos de trabajo que comprenden nodos de distintos tipos, puede ser Es tentador aprovechar las interfaces de Golang para encapsular sus diversos comportamientos. Sin embargo, almacenar dichos flujos de trabajo en MongoDB plantea un desafío único.
El problema de asignabilidad
El error encontrado durante la operación Buscar se debe a la incompatibilidad entre el documento decodificado y el Interfaz de nodo. Mgo carece de la información de tipo necesaria para determinar el tipo específico de cada nodo integrado. Esto da como resultado una discrepancia en la asignación.
Enfoque alternativo: incrustar con información de tipo
Para superar este obstáculo, considere encapsular la información de tipo dentro de los nodos incrustados. Defina una nueva estructura, NodeWithType, que consta de la interfaz Node y un campo Tipo que representa el tipo específico.
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
Desclasificación BSON personalizada
Para cerrar la brecha entre el documento decodificado y la estructura Go, implemente la función SetBSON para NodeWithType. Esta función decodificará el campo Tipo, creará una instancia del tipo correspondiente y le delegará la desclasificación.
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
}
En la estructura de flujo de trabajo, reemplace la porción de Nodo con una porción de NodeWithType.
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
Con este enfoque, Mgo ahora puede encontrar y desorganizar con éxito flujos de trabajo con nodos integrados de diferentes tipos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3