使用gopkg.in/mgo.v2/bson
,我想知道如何将接口{}值编组为bson.Raw
类型的值。
bson.Raw
州的
使用此类型可以部分解组或编组值。
但是我找不到会返回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
}
输出:
& {种类:2数据:[12 0 0 0 72 101 108 108 111 32 119 111 114 108 100 0]}
答案 0 :(得分:2)
我认为bson.Raw旨在用作变量的类型。
例如:(在play)
type Bar struct {
AnInt int
AString bson.Raw
}
“AString”字段将保留为链接提及的bson.Raw结构。
如果您想部分解码嵌套结构的顶层以找出其实际类型,那么这非常有用,因此您可以将其余部分解析为正确的数据类型。
注意,上面是未经测试的,而不是在我可以实际运行的机器前面。这是基于它像标准编码/ json包一样工作的假设。
答案 1 :(得分:2)
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仅支持顶级文档,因此我们知道这必须是正确的。