Compreendendo os tipos de interface em modelos mgo
No contexto do MongoDB e Go, modelar dados com interfaces pode apresentar desafios devido à natureza dinâmica de interfaces. Aqui está uma explicação concisa do problema que você encontrou e uma solução sugerida.
O problema com tipos de interface
O modelo de dados baseado em documento do MongoDB não fornece tipo informações para documentos incorporados. Ao usar mgo para desempacotar documentos MongoDB contendo tipos de interface em estruturas Go, mgo não pode determinar o tipo específico de cada documento incorporado. Isso resulta no erro "o valor do tipo bson.M não pode ser atribuído ao tipo Node." é agrupar o tipo de interface em uma estrutura personalizada que fornece informações de tipo. Isso permite que mgo identifique o tipo específico do documento incorporado durante a desempacotamento.
Considere o seguinte exemplo:
type NodeWithType struct { Nó Nó `bson:"-"` Digite string } tipo estrutura de fluxo de trabalho { CriadoNa hora.Time StartedAt time.Time Criado por string Nós []NodeWithType }Implementando a função SetBSON
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
func (nt *NodeWithType) SetBSON(r bson.Raw) error { //Decodifica o campo "Tipo" e determina o tipo de nó var typeStr string se errar := r.Unmarshal(&typeStr); err! = nulo { retornar errar } // Cria uma nova instância do tipo Node com base na string do tipo nó, ok:= reflect.New(reflect.TypeOf(Node).Elem()).Interface().(Node) se !ok { retornar erros.New("tipo de nó inválido") } // Descompacta os dados restantes na instância do Node se errar := r.Unmarshal(nó); err! = nulo { retornar errar } // Atribui a instância do Node à estrutura NodeWithType nt.Node = nó retorno nulo }
Conclusão
func (nt *NodeWithType) SetBSON(r bson.Raw) error {
// Decode the "Type" field and determine the Node type
var typeStr string
if err := r.Unmarshal(&typeStr); err != nil {
return err
}
// Create a new instance of the Node type based on the type string
node, ok := reflect.New(reflect.TypeOf(Node).Elem()).Interface().(Node)
if !ok {
return errors.New("invalid Node type")
}
// Unmarshal the remaining data into the Node instance
if err := r.Unmarshal(node); err != nil {
return err
}
// Assign the Node instance to the NodeWithType struct
nt.Node = node
return nil
}
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