Интерфейс как модель в Mgo (Go): устранение ошибки присваиваемости
При работе с рабочими процессами, состоящими из узлов разных типов, может возникнуть возникает соблазн использовать интерфейсы Golang для инкапсуляции их разнообразного поведения. Однако хранение таких рабочих процессов в MongoDB представляет собой уникальную проблему.
Проблема назначения
Ошибка, возникшая во время операции поиска, связана с несовместимостью между декодированным документом и Интерфейс узла. В Mgo отсутствует информация о типе, необходимая для определения конкретного типа каждого встроенного узла. Это приводит к несоответствию присваиваний.
Альтернативный подход: внедрение информации о типе
Чтобы преодолеть это препятствие, рассмотрите возможность инкапсуляции информации о типе во встроенные узлы. Определите новую структуру NodeWithType, которая состоит из интерфейса Node и поля Type, представляющего определенный тип.
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
Пользовательская демаршалинг BSON
Чтобы устранить разрыв между декодированным документом и структурой Go, реализуйте функцию SetBSON для NodeWithType. Эта функция декодирует поле «Тип», создаст экземпляр соответствующего типа и делегирует ему демаршалинг.
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
}
В структуре рабочего процесса замените фрагмент узла фрагментом NodeWithType.
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
Благодаря такому подходу Mgo теперь может успешно находить и демаршализировать рабочие процессы со встроенными узлами разных типов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3