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