Mgo(Go)中的介面作為模型:解決可分配性錯誤
當處理包含不同類型節點的工作流程時,可能會人們傾向於利用Golang 介面來封裝其不同的行為。然而,在 MongoDB 中儲存這樣的工作流程帶來了獨特的挑戰。
可分配性問題
查找作業期間遇到的錯誤源自於解碼文件與解碼文件之間的不相容。節點接口。 Mgo 缺乏確定每個嵌入節點的特定類型所需的類型資訊。這會導致分配不匹配。
替代方法:嵌入類型資訊
要克服此障礙,請考慮將類型資訊封裝在嵌入節點中。定義一個新的結構體 NodeWithType,它由 Node 介面和表示特定類型的 Type 欄位組成。
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
自訂 BSON 解組
要彌合解碼文件和 Go 結構之間的差距,請為 NodeWithType 實作 SetBSON 函數。該函數將解碼 Type 字段,創建相應類型的實例,並將解碼委託給它。
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
}
在 Workflow 架構中,將 Node 切片替換為 NodeWithType 的切片。
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
透過這種方法,Mgo 現在可以成功尋找和解組具有不同類型的嵌入式節點的工作流程。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3