Mgo(Go)中的介面作為模型:解決可分配性錯誤
當處理包含不同類型節點的工作流程時,可能會出現人們很想利用Golang 介面來封裝其不同的行為。然而,在 MongoDB 中儲存此類工作流程帶來了獨特的挑戰。
可分配性問題
尋找操作期間遇到的錯誤源自於解碼文件與節點介面。 Mgo 缺乏確定每個嵌入節點的特定類型所需的類型資訊。這會導致分配不匹配。
替代方法:嵌入類型資訊
要克服此障礙,請考慮將類型資訊封裝在嵌入的節點中。定義一個新的結構體 NodeWithType,它由 Node 介面和表示特定類型的 Type 欄位組成。
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string }</code>
自訂 BSON 解組
彌補差距在解碼後的文件和 Go 結構之間,為 NodeWithType 實作 SetBSON 函數。此函數將解碼 Type 字段,建立對應類型的實例,並將解碼委託給它。
<code class="go">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 }</code>
在 Workflow 結構體中,將 Node 切片替換為 NodeWithType 切片。
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
透過這種方法,Mgo 現在可以成功找到和解組具有不同類型的嵌入式節點的工作流程。
以上是如何使用 Mgo (Go) 在 MongoDB 中儲存具有不同節點類型的工作流程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!