首頁 > 後端開發 > Golang > 主體

如何使用 mgo 在 MongoDB 模型中嵌入 Go 介面?

Susan Sarandon
發布: 2024-10-26 03:12:27
原創
1007 人瀏覽過

 How Can You Embed Go Interfaces in MongoDB Models Using mgo?

使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板