首页 >后端开发 >Golang >如何为 Go 结构实现自定义 BSON 编组?

如何为 Go 结构实现自定义 BSON 编组?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-01 17:03:13389浏览

How to Implement Custom BSON Marshalling for a Go Struct?

自定义数据结构的自定义 BSON 编组

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn