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 サイトの他の関連記事を参照してください。