Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Anda Boleh Membenamkan Antara Muka Go dalam Model MongoDB Menggunakan mgo?

Bagaimanakah Anda Boleh Membenamkan Antara Muka Go dalam Model MongoDB Menggunakan mgo?

Susan Sarandon
Susan Sarandonasal
2024-10-26 03:12:27926semak imbas

 How Can You Embed Go Interfaces in MongoDB Models Using mgo?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn