mgo (Go) のモデルとしてのインターフェイス型
問題:
シナリオ内さまざまなタイプのワークフローと組み込みノードが関与する場合、mgo を使用して MongoDB 内のノードをモデリングするためのインターフェイスを使用すると、エラーが発生します。このエラーは、mgo が型情報なしで埋め込まれた Node ドキュメントをアンマーシャリングできないために発生します。
解決策:
この制限を克服するには、両方の Node 型を保持する構造体を定義することを検討してください。および関連する型情報:
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string }</code>
ワークフロー構造体内で、NodeWithType 構造体の配列を使用してノードを保存します:
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
データを正しくデコードするには、SetBSON 関数を実装します。 on NodeWithType:
<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error { // Decode the type string typeStr := r.String() // Create a new Node value based on the type string switch typeStr { case "EmailNode": nt.Node = &EmailNode{} case "TwitterNode": nt.Node = &TwitterNode{} default: return errors.New("Unknown node type") } // Unmarshal the remaining data to the Node value bsonBytes, err := bson.Marshal(r.Body) if err != nil { return err } return bson.Unmarshal(bsonBytes, nt.Node) }</code>
このアプローチにより、mgo は、NodeWithType 構造体に格納されている型情報に基づいて、埋め込みノードを正しくアンマーシャリングできます。
以上がインターフェイスを使用して mgo で MongoDB のさまざまなタイプの組み込みノードをモデル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。