Go에서 개발자는 복잡한 데이터 구조에 대해 사용자 정의 마샬링 및 역마샬링 기능이 필요한 시나리오에 자주 직면합니다. MongoDB의 바이너리 데이터 형식인 BSON으로 작업할 때 사용자 지정 마샬링이 필요합니다. 이 기사에서는 Getter 및 Setter 인터페이스를 통해 사용자 정의 BSON 마샬링을 정의하는 개념을 소개합니다.
특히 질문은 통화 값과 통화 코드를 캡슐화하는 통화 구조체에 대한 사용자 정의 BSON 마샬링을 작성하는 방법에 중점을 둡니다. MarshalJSON 및 UnmarshalJSON 메서드는 사용자 지정 JSON 마샬링 및 역마샬링을 위한 효과적인 접근 방식으로 시연됩니다. 그러나 BSON 마샬링에 대한 문서를 찾는 것은 어려울 수 있습니다.
사용자 정의 BSON 마샬링을 구현하려면 통화 구조체가 bson.Getter 및 bson.Setter 인터페이스를 구현해야 합니다. GetBSON 메서드는 통화 구조체의 BSON 친화적 표현을 반환하고, SetBSON 메서드는 제공된 BSON 데이터를 기반으로 통화 구조체의 값을 설정합니다. 아래 코드는 이러한 구현을 보여줍니다.
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와 통화 구조체를 원활하게 사용할 수 있으므로 통화 데이터의 사용자 지정 마샬링 및 역마샬링이 가능합니다.
위 내용은 Go 구조체에 대한 사용자 정의 BSON 마샬링을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!