2015-06-17 7 views
0

Ранее я отправил this question, прося о написании пользовательских BSON-маршаллинга/unmarshalling в Go, используя mgo. Теперь я пришел, чтобы проверить это. Думаю, я столкнулся с большой проблемой. Все мои структуры не связаны с нулевыми значениями.Почему 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.v2 буквально вчера, поэтому я надеюсь, что это было актуально, и ошибка, подобная этой, отсутствовала бы в «самом горячем драйвере MongoDB».

+0

Ваш геттер и сеттер не симметричны. GetBSON возвращает байт [], SetBSON необходимо отключить байтовый тип [] и снова сделать unmarshal для преобразования [] байта в структуру. –

ответ

2

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

+0

Muchas gracias :) Я избавился от bson.Marshal вокруг структуры возврата, и она мгновенно сработала. – leylandski