ホームページ >バックエンド開発 >Golang >mgo を使用して MongoDB モデルに Go インターフェイスを埋め込むにはどうすればよいですか?

mgo を使用して MongoDB モデルに Go インターフェイスを埋め込むにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 03:12:271083ブラウズ

 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 は 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。