Interface como modelo em Mgo (Go): Resolvendo o erro de atribuição
Ao lidar com fluxos de trabalho compreendendo nós de tipos variados, pode ser tentador aproveitar as interfaces Golang para encapsular seus diversos comportamentos. No entanto, armazenar esses fluxos de trabalho no MongoDB representa um desafio único.
O problema de atribuição
O erro encontrado durante a operação Find decorre da incompatibilidade entre o documento decodificado e o Interface do nó. O Mgo não possui as informações de tipo necessárias para determinar o tipo específico de cada nó incorporado. Isso resulta em uma incompatibilidade de atribuição.
Abordagem alternativa: incorporação com informações de tipo
Para superar esse obstáculo, considere encapsular as informações de tipo nos nós incorporados. Defina uma nova estrutura, NodeWithType, que consiste na interface Node e um campo Type representando o tipo específico.
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
Desempacotamento BSON personalizado
Para preencher a lacuna entre o documento decodificado e a estrutura Go, implemente a função SetBSON para NodeWithType. Esta função irá decodificar o campo Type, criar uma instância do tipo correspondente e delegar a desempacotamento a ele.
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
}
Na estrutura de fluxo de trabalho, substitua a fatia Node por uma fatia de NodeWithType.
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
Com essa abordagem, Mgo agora pode encontrar e desempacotar fluxos de trabalho com nós incorporados de diferentes tipos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3