Membenamkan Antara Muka dalam Model MongoDB dengan mgo
Apabila bekerja dengan sistem aliran kerja yang melibatkan nod pelbagai jenis, adalah perkara biasa untuk menggunakan antara muka Go untuk mewakili jenis nod yang berbeza. Walau bagaimanapun, pendekatan ini memberikan cabaran apabila menyimpan aliran kerja ini dalam MongoDB menggunakan mgo.
Pertimbangkan contoh berikut:
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []Node } type Node interface { Exec() (int, error) }</code>
Di mana Node ialah antara muka dengan satu kaedah, Exec() yang boleh dilaksanakan oleh jenis nod yang berbeza.
Untuk menyimpan aliran kerja dalam MongoDB, anda boleh cuba mencarinya melalui ID:
<code class="go">w = &Workflow{} collection.FindID(bson.ObjectIdHex(id)).One(w)</code>
Walau bagaimanapun, anda akan menghadapi ralat kerana mgo tidak boleh unmarshal antara muka Nod terbenam terus ke dalam struct Go. Ini kerana ia tidak mempunyai maklumat jenis yang diperlukan untuk mencipta jenis konkrit yang sesuai untuk setiap nod.
Untuk menangani isu ini, anda boleh menentukan struct yang secara eksplisit memegang kedua-dua jenis nod dan nilai nod sebenar:
<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>
Dengan menggunakan bson:"-", subfield Nod dikecualikan daripada penyahkodan automatik dan sebaliknya dikendalikan secara manual dalam fungsi 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>
Pendekatan ini membolehkan mgo mengenal pasti jenis setiap nod dan cipta contoh konkrit yang sesuai semasa penyahkodan, menyelesaikan isu maklumat jenis.
Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Membenamkan Antara Muka Go dalam Model MongoDB Menggunakan mgo?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!