我在Golang有以下类型:

< code > type base 64 data[]byte

为了支持将base64编码的字符串解组为该类型,我执行了以下操作:

func (b *Base64Data) UnmarshalJSON(data []byte) error {
    if len(data) == 0 {
        return nil
    }

    content, err := base64.StdEncoding.DecodeString(string(data[1 : len(data)-1]))
    if err != nil {
        return err
    }

    *b = []byte(xml)
    return nil
}

现在我还希望能够使用 mgo Golang 库将其封送和解组到 mongo 数据库。问题是我已经将文档存储为 base64 编码字符串,所以我必须维护它。我尝试执行以下操作:

func (b Base64Data) GetBSON() (interface{}, error) {
    return base64.StdEncoding.EncodeToString([]byte(b)), nil
}

func (b *Base64DecodedXml) SetBSON(raw bson.Raw) error {
    var s string
    var err error
    if err = raw.Unmarshal(&s); err != nil {
        return err
    }
    *b, err = base64.StdEncoding.DecodeString(s)
    return err
}

所以解组后,数据已经被解码,所以我需要对其进行编码,并将其作为字符串返回,以便将其作为字符串写入db(反之亦然)为此,我实现了bson getter和setter,但似乎只有getter工作正常

JSON从base64编码的字符串解组,以及将它封送到数据库。但是unmarshling setter好像根本不被调用。

有人能告诉我我遗漏了什么吗,这样我就可以在内存中正确地保存解码的数据,但编码的字符串类型?

这是我尝试运行的一个测试:

b := struct {
    Value shared.Base64Data `json:"value" bson:"value"`
}{}
s := `{"value": "PHJvb3Q+aGVsbG88L3Jvb3Q+"}`
require.NoError(t, json.Unmarshal([]byte(s), &b))
t.Logf("%v", string(b.Value))
b4, err := bson.Marshal(b)
require.NoError(t, err)
t.Logf("%v", string(b4))
require.NoError(t, bson.Unmarshal(b4, &b))
t.Logf("%v", string(b.Value))