ホームページ >バックエンド開発 >Golang >カスタム JSON マーシャリングと同様に、Go でカスタム BSON マーシャリングを実現するにはどうすればよいですか?

カスタム JSON マーシャリングと同様に、Go でカスタム BSON マーシャリングを実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-01 06:44:09713ブラウズ

How to Achieve Custom BSON Marshaling in Go, Similar to Custom JSON Marshaling?

カスタム BSON マーシャリング: カスタム JSON マーシャリングと同等

Currency 構造体で示したカスタム JSON マーシャリングと同様のカスタム BSON マーシャリングを実現するにはでは、bson.Getter インターフェイスと bson.Setter インターフェイスを利用できます。これらのインターフェイスを使用すると、BSON 形式で値をエンコードおよびデコードする方法をカスタマイズできます。

カスタム BSON Getter および Setter の実装

Currency 構造体を更新して、 bson.Getter および bson.Setter インターフェイスは次のようになります。

// Currency struct implements bson.Getter and bson.Setter
type Currency struct {
    value        decimal.Decimal
    currencyCode string
}

// GetBSON implements bson.Getter.
func (c Currency) GetBSON() (interface{}, error) {
    value := c.Value().Float64()
    return struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        value,
        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 {
        return bsonErr
    }

    c.value = decimal.NewFromFloat(decoded.Value)
    c.currencyCode = decoded.CurrencyCode
    return nil
}

親構造体でのカスタム BSON マーシャリングの使用

カスタム JSON マーシャリングと同様に、Currency 構造体が更新されると、通貨フィールドは、mgo.Marshal または bson.Encode を呼び出すときに、自動的にカスタム マーシャリングを使用します。出力 BSON には、エクスポートされたフィールドを含む別の構造体を必要とせずに、必要なフィールド名とデータ値が含まれます。

以上がカスタム JSON マーシャリングと同様に、Go でカスタム BSON マーシャリングを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。