Rumah > pembangunan bahagian belakang > Golang > 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
Lepaskan: 2024-10-26 03:12:27
asal
1081 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan