使用 gopkg.in/mgo.v2/bson
,我想知道如何将 interface{} 值编码为 bson.Raw
类型的值。
The documentation对于 bson.Raw
状态:
Using this type it is possible to unmarshal or marshal values partially.
但是我找不到可以返回 bson.Raw
的 Marshal 函数。
我错过了什么?
我尝试做的事的例子:
package main
import (
"fmt"
"gopkg.in/mgo.v2/bson"
)
func main() {
// How to avoid a MarshalRaw help function?
raw, err := MarshalRaw("Hello world")
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", raw)
}
func MarshalRaw(v interface{}) (*bson.Raw, error) {
bin, err := bson.Marshal(struct{ Raw interface{} }{v})
if err != nil {
return nil, err
}
var raw struct{ Raw bson.Raw }
err = bson.Unmarshal(bin, &raw)
if err != nil {
return nil, err
}
return &raw.Raw, nil
}
输出:
&{Kind:2 Data:[12 0 0 0 72 101 108 108 111 32 119 111 114 108 100 0]}
最佳答案
bson.Raw在编码和解码时用作值。
要将 interface{}
转换为 bson.Raw
,首先要做的是对其进行编码,以便获得表示任何内容的纯文档数据正在编码:
var value interface{} = bson.M{"some": "value"}
data, err := bson.Marshal(value)
if err != nil {
log.Fatal(err)
}
然后它可能将一个或多个字段解码为 bson.Raw
值:
var doc struct{ Some bson.Raw }
err = bson.Unmarshal(data, &doc)
if err != nil {
log.Fatal(err)
}
甚至整个文档:
var doc bson.Raw
err = bson.Unmarshal(data, &doc)
if err != nil {
log.Fatal(err)
}
如果你想要整个文档而不只是一个字段,你也可以使用这个快捷方式:
doc := bson.Raw{3, data}
常量 3 表示 bson specification 中的文档, 它当然必须与提供的数据相匹配。由于 BSON 只支持顶层的文档,我们知道这一定是正确的。
关于go - 编码成 bson.Raw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276884/