Go でのカスタム BSON マーシャリングの処理
MongoDB のコンテキストでカスタム データ構造を扱う場合、カスタム マーシャリングとBSON 形式のデータの正しい表現と処理を保証するアンマーシャリング ロジック。この点に関して、Go は、特定のデータ型のカスタム マーシャリングおよびアンマーシャリングを可能にする bson.Getter や bson.Setter などのインターフェイスを提供します。
次の例を考えてみましょう。ここでは、Currency 構造体がカスタム MarshalJSON および UnmarshalJSON とともに定義されています。 JSON エンコードとデコードを処理するメソッド:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. } // MarshalJSON implements json.Marshaller. func (c Currency) MarshalJSON() ([]byte, error) { f, _ := c.Value().Float64() return json.Marshal(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }{ Value: f, CurrencyCode: c.CurrencyCode(), }) } // UnmarshalJSON implements json.Unmarshaller. func (c *Currency) UnmarshalJSON(b []byte) error { decoded := new(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }) jsonErr := json.Unmarshal(b, decoded) if jsonErr == nil { c.value = decimal.NewFromFloat(decoded.Value) c.currencyCode = decoded.CurrencyCode return nil } else { return jsonErr } }
カスタム BSON マーシャリングを実現するには、 Currency 構造体に bson.Getter インターフェイスと bson.Setter インターフェイスを実装することで、同様のアプローチを使用できます。
// 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 } }
これらのインターフェイスを実装することにより、Currency 構造体にはフィールドをマップするカスタム BSON マーシャリング ロジックが追加されました。目的の BSON 表現。MongoDB コンテキストでカスタム データ型を効果的に処理します。
以上がMongoDB 用に Go でカスタム BSON マーシャリングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。