Mengendalikan Custom BSON Marshalling dalam Go
Apabila berurusan dengan struktur data tersuai dalam konteks MongoDB, ia menjadi perlu untuk melaksanakan marshaling tersuai dan logik unmarshaling untuk memastikan perwakilan dan pengendalian data yang betul dalam format BSON. Dalam hal ini, Go menyediakan antara muka seperti bson.Getter dan bson.Setter, yang membenarkan marshaling tersuai dan unmarshaling jenis data tertentu.
Pertimbangkan contoh berikut, di mana struct Mata Wang ditakrifkan bersama MarshalJSON tersuai dan UnmarshalJSON kaedah untuk mengendalikan pengekodan dan penyahkodan JSON:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. } // MarshalJSON implements json.Marshaller. func (c Currency) MarshalJSON() ([]byte, error) { f, _ := c.Value().Float64() return json.Marshal(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }{ Value: f, CurrencyCode: c.CurrencyCode(), }) } // UnmarshalJSON implements json.Unmarshaller. func (c *Currency) UnmarshalJSON(b []byte) error { decoded := new(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }) jsonErr := json.Unmarshal(b, decoded) if jsonErr == nil { c.value = decimal.NewFromFloat(decoded.Value) c.currencyCode = decoded.CurrencyCode return nil } else { return jsonErr } }
Untuk mencapai marshaling BSON tersuai, pendekatan yang serupa boleh digunakan dengan melaksanakan antara muka bson.Getter dan bson.Setter dalam struct Currency:
// GetBSON implements bson.Getter. func (c Currency) GetBSON() (interface{}, error) { f := c.Value().Float64() return struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }{ Value: f, CurrencyCode: c.currencyCode, }, nil } // SetBSON implements bson.Setter. func (c *Currency) SetBSON(raw bson.Raw) error { decoded := new(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }) bsonErr := raw.Unmarshal(decoded) if bsonErr == nil { c.value = decimal.NewFromFloat(decoded.Value) c.currencyCode = decoded.CurrencyCode return nil } else { return bsonErr } }
Dengan melaksanakan antara muka ini, struct Currency kini mempunyai logik marshaling BSON tersuai yang memetakan medannya kepada BSON yang dikehendaki perwakilan, mengendalikan jenis data tersuai dengan berkesan dalam konteks aMongoDB.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pemasaran BSON Tersuai dalam Go untuk MongoDB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!