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 は 1 つのメソッド 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 は次のタイプを識別できます。各ノードをデコードし、デコード中に適切な具象インスタンスを作成し、型情報の問題を解決します。
以上がmgo を使用して MongoDB モデルに Go インターフェイスを埋め込むにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。