Mgo (Go) のモデルとしてのインターフェイス: 割り当て可能性エラーの解決
さまざまなタイプのノードで構成されるワークフローを処理する場合、次のような問題が発生する可能性があります。 Golang インターフェースを活用して、その多様な動作をカプセル化したいと考えています。ただし、そのようなワークフローを MongoDB に保存すると、特有の課題が生じます。
割り当て可能性の問題
検索操作中に発生したエラーは、デコードされたドキュメントとノードインターフェース。 Mgo には、各組み込みノードの特定のタイプを決定するために必要なタイプ情報が不足しています。これにより、割り当ての不一致が発生します。
代替アプローチ: 型情報を使用した埋め込み
このハードルを克服するには、埋め込みノード内に型情報をカプセル化することを検討してください。新しい構造体 NodeWithType を定義します。これは、Node インターフェイスと、特定の型を表す Type フィールドで構成されます。
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
カスタム BSON アンマーシャリング
デコードされたドキュメントと Go 構造体のギャップを埋めるには、NodeWithType の SetBSON 関数を実装します。この関数は、Type フィールドをデコードし、対応する型のインスタンスを作成し、それにアンマーシャリングを委任します。
func (nt *NodeWithType) SetBSON(r bson.Raw) error {
// Decode Type field
var typeName string
err := bson.Unmarshal(r["Type"], &typeName)
if err != nil {
return err
}
// Create an instance of the correct type based on Type field
var node Node
switch typeName {
case "EmailNode":
node = &EmailNode{}
case "TwitterNode":
node = &TwitterNode{}
}
// Unmarshal the remaining fields into the created instance
if err = node.SetBSON(r[typeName]); err != nil {
return err
}
// Assign the created instance to the Node field
nt.Node = node
return nil
}
ワークフロー構造体で、ノード スライスを NodeWithType のスライスに置き換えます。
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
このアプローチにより、Mgo はさまざまなタイプの埋め込みノードを含むワークフローを正常に見つけてアンマーシャリングできるようになりました。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3