在Go中,我得到了json编组/解组 . 如果结构或类型具有MarshalJSON方法,则在另一个具有前者作为字段的结构上调用json.Marshal时,将调用结构的MarshalJSON方法 . 从我收集到的并在实践中看到的......

  • type MyType struct 有一个MarshalJSON方法来编组自己的字符串 .

  • type MyDocument struct 已将 MyType 作为字段 .

  • MyDocument 上调用 json.Marshal() 时, MyType 字段将作为字符串进行编组,因为它实现了 json.Marshaller .

我正在尝试使我的系统与数据库无关,并且正在使用mgo驱动程序为MongoDB实现服务,这意味着在所有结构上实现 bson.Getterbson.Setter 以及我想要以特定方式编组的东西 . 这是令人困惑的地方 .

因为Go并没有使用Shopspring的十进制包(找到here)来处理货币值 . 十进制编组到JSON完美但我有一个命名类型 type Currency decimal.Decimal ,我无法编组到BSON .

这些是我的实现,它将十进制转换为float64并尝试编组,就像我为json所做的那样:

/*
Implements the bson.Getter interface.
*/
func (c Currency) GetBSON() (interface{}, error) {
    f, _ := decimal.Decimal(c).Float64()
    return f, nil
}

/*
Implements the bson.Setter interface.
*/
func (c *Currency) SetBSON(raw bson.Raw) error {
    var f float64
    e := raw.Unmarshal(&f)
    if e == nil {
        *c = Currency(decimal.NewFromFloat(f))
    }
    return e
}

唯一的问题是在bson包的文档中:

Marshal序列化in值,可以是map或struct值 .

因为它不是结构或 Map ,所以它只生成一个空文档 .

我只是试图编组一些数据,这些数据只需要作为较大结构的一部分进行编组,但是程序包只允许我在整个文档中执行此操作 . 我该怎么做才能得到我需要的结果?