Jenis Antara Muka sebagai Model dalam mgo (Go)
Masalah:
Dalam senario melibatkan aliran kerja dan nod terbenam pelbagai jenis, menggunakan antara muka untuk memodelkan nod dalam MongoDB dengan mgo menghasilkan ralat. Ralat berlaku kerana mgo tidak boleh menyahmarshal dokumen Nod terbenam tanpa maklumat jenis.
Penyelesaian:
Untuk mengatasi had ini, pertimbangkan untuk menentukan struct untuk memegang kedua-dua jenis Nod dan maklumat jenis yang berkaitan:
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string }</code>
Dalam struct Aliran Kerja, gunakan tatasusunan struct NodeWithType untuk menyimpan nod:
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
Untuk menyahkod data dengan betul, laksanakan fungsi SetBSON pada NodeWithType:
<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error { // Decode the type string typeStr := r.String() // Create a new Node value based on the type string switch typeStr { case "EmailNode": nt.Node = &EmailNode{} case "TwitterNode": nt.Node = &TwitterNode{} default: return errors.New("Unknown node type") } // Unmarshal the remaining data to the Node value bsonBytes, err := bson.Marshal(r.Body) if err != nil { return err } return bson.Unmarshal(bsonBytes, nt.Node) }</code>
Pendekatan ini membolehkan mgo menyahmarshal nod terbenam dengan betul, berdasarkan maklumat jenis yang disimpan dalam struct NodeWithType.
Atas ialah kandungan terperinci Bagaimana untuk Memodelkan Nod Terbenam Pelbagai Jenis dalam MongoDB dengan mgo menggunakan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!