在 Go 中,开发人员经常遇到需要对复杂数据结构进行自定义编组和解组功能的场景。使用 BSON(MongoDB 的二进制数据格式)时,会出现自定义编组的需求。本文介绍了通过 Getter 和 Setter 接口定义自定义 BSON 编组的概念。
具体来说,问题重点在于如何为封装货币值和货币代码的货币结构编写自定义 BSON 编组。 MarshalJSON 和 UnmarshalJSON 方法被证明是自定义 JSON 编组和解组的有效方法。然而,查找有关 BSON 编组的文档可能具有挑战性。
要实现自定义 BSON 编组,Currency 结构必须实现 bson.Getter 和 bson.Setter 接口。 GetBSON 方法返回Currency 结构的BSON 友好表示,SetBSON 方法根据提供的BSON 数据设置Currency 结构的值。下面的代码演示了这些实现:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. } // 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 } }
通过实现这些方法,开发人员现在可以将货币结构与 MongoDB 无缝使用,从而允许自定义编组和解组货币数据。
以上是如何为 Go 结构实现自定义 BSON 编组?的详细内容。更多信息请关注PHP中文网其他相关文章!