Maison >développement back-end >Golang >Comment implémenter un marshalling BSON personnalisé pour une structure Go ?

Comment implémenter un marshalling BSON personnalisé pour une structure Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 17:03:13455parcourir

How to Implement Custom BSON Marshalling for a Go Struct?

Marshalling BSON personnalisé pour les structures de données personnalisées

Dans Go, les développeurs rencontrent souvent des scénarios dans lesquels ils ont besoin de fonctionnalités de marshalling et de démarshall personnalisées pour les structures de données complexes. Lorsque vous travaillez avec BSON, le format de données binaires de MongoDB, le besoin d'un marshalling personnalisé se fait sentir. L'article présente le concept de définition du marshaling BSON personnalisé via les interfaces Getter et Setter.

Plus précisément, la question se concentre sur la façon d'écrire un marshaling BSON personnalisé pour une structure de devise qui encapsule une valeur monétaire et un code monétaire. Les méthodes MarshalJSON et UnmarshalJSON sont démontrées comme des approches efficaces pour le marshalling et le démarshalling JSON personnalisé. Cependant, trouver de la documentation sur le marshalling BSON peut être difficile.

Pour réaliser un marshalling BSON personnalisé, la structure Currency doit implémenter les interfaces bson.Getter et bson.Setter. La méthode GetBSON renvoie une représentation compatible BSON de la structure monétaire et la méthode SetBSON définit la valeur de la structure monétaire en fonction des données BSON fournies. Le code ci-dessous illustre ces implémentations :

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
    }
}

En implémentant ces méthodes, les développeurs peuvent désormais utiliser la structure Currency de manière transparente avec MongoDB, permettant un marshalling et un démarshall personnalisé des données monétaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn