Почему mgo не размаршализирует мою структуру должным образом?

Ранее я публиковал этот вопрос с вопросом о написании пользовательского маршаллинга / демаршаллинга BSON в Пойдите, используя mgo. Теперь я пришел проверить это, думаю, я столкнулся с более серьезной проблемой. Все мои структуры неупорядочены до нулевых значений.

Это моя структура валюты с реализациями bson.Getter и bson.Setter:

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 bson.Marshal(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        f,
        CurrencyCode: c.currencyCode,
    })
}

/*
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"`
    })

    fmt.Println(string(raw.Data))
    bsonErr := raw.Unmarshal(decoded)

    if bsonErr == nil {
        fmt.Println("Debug: no error returned.")
        fmt.Println(decoded)
        c.value = decimal.NewFromFloat(decoded.Value)
        c.currencyCode = decoded.CurrencyCode
        return nil
    } else {
        return bsonErr
    }
}

Посмотрев на необработанные данные, они правильно маршалируются, но при демаршалинге результирующая структура просто пуста. Есть идеи, где я здесь ошибаюсь? Я использовал go get gopkg.in/mgo.v2command буквально вчера, поэтому я надеюсь, что она актуальна и подобная ошибка не будет присутствовать в «самом популярном драйвере MongoDB».


person leylandski    schedule 17.06.2015    source источник
comment
ваш геттер и сеттер не симметричны. Если GetBSON возвращает байт [], SetBSON необходимо демаршалировать тип байта [] и снова выполнить демаршалирование, чтобы преобразовать байт [] в структуру.   -  person Jiang YD    schedule 18.06.2015


Ответы (1)


Метод GetBSON должен возвращать маршалируемое значение, а не двоичные данные, полученные в результате маршалинга. . Вот почему его первый тип результата interface{}, а не []byte.

person Gustavo Niemeyer    schedule 17.06.2015
comment
Muchas gracias :) Я избавился от bson.Marshal вокруг структуры return, и это сразу сработало. - person leylandski; 18.06.2015
comment
Привет, как я могу добиться того же, используя этот драйвер? go.mongodb.org/mongo-driver/mongo - person Rohman HM; 19.05.2020