使用mgo 在MongoDB 模型中嵌入介面
當使用涉及不同類型節點的工作流程系統時,通常使用Go 介面來表示不同的節點類型。然而,當使用 mgo 將這些工作流程儲存在 MongoDB 中時,這種方法提出了挑戰。
考慮以下範例:
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []Node } type Node interface { Exec() (int, error) }</code>
其中 Node 是一個具有單一方法 Exec() 的接口,可以透過不同的節點類型來實現。
要將工作流程儲存在MongoDB 中,您可以嘗試透過ID 尋找它:
<code class="go">w = &Workflow{} collection.FindID(bson.ObjectIdHex(id)).One(w)</code>
但是,您會遇到錯誤,因為mgo 無法解組將Node 介面直接嵌入到Go 結構中。這是因為它缺乏必要的類型資訊來為每個節點創建適當的具體類型。
要解決此問題,您可以定義一個明確保存節點類型和實際節點值的結構體:
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string } type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
透過使用bson:"-",Node 子欄位被排除在自動解碼之外,而是在SetBSON 函數中手動處理:
<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error { // Decode the node type from the "Type" field // Create a new instance of the concrete node type based on the decoded type // Unmarshal the remaining document into the concrete node type //... }</code>
這種方法允許mgo 識別Node 的類型每個節點並在解碼過程中創建適當的具體實例,解決類型信息問題。
以上是如何使用 mgo 在 MongoDB 模型中嵌入 Go 介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!