为什么 mgo 不能正确解组我的结构?

Why won't mgo unmarshall my struct properly?

早些时候我发布了 询问关于使用 mgo 在 Go 中编写自定义 BSON marshalling/unmarshalling。现在我来测试它,我想我遇到了一个更大的问题。我所有的结构都解组为零值。

这是我的货币结构,实现了 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 命令,所以我希望它是最新的,这样的错误不会出现在 "the hottest MongoDB driver around".

GetBSON 方法应该return 要编组的值,而不是编组产生的二进制数据。这就是为什么它的第一个结果类型是 interface{} 而不是 []byte.