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

Go 構造体にカスタム BSON マーシャリングを実装するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-01 17:03:13
オリジナル
458 人が閲覧しました

How to Implement Custom BSON Marshalling for a Go Struct?

カスタム データ構造のカスタム BSON マーシャリング

Go では、開発者は、複雑なデータ構造に対してカスタム マーシャリングおよびアンマーシャリング機能が必要になるシナリオによく遭遇します。 MongoDB のバイナリ データ形式である BSON を使用する場合、カスタム マーシャリングの必要性が生じます。この記事では、Getter インターフェイスと Setter インターフェイスを通じてカスタム BSON マーシャリングを定義する概念を紹介します。

特に、通貨値と通貨コードをカプセル化する Currency 構造体のカスタム 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 とシームレスに Currency 構造体を使用できるようになり、通貨データのカスタム マーシャリングおよびアンマーシャリングが可能になります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート