使用gopkg.in/mgo.v2/bson,我想知道如何将interface {}的值编组为type的值bson.Raw。
gopkg.in/mgo.v2/bson
bson.Raw
该文档的bson.Raw状态:
使用这种类型的能够解组或 编组 值部分。
但我找不到会返回的Marshal函数bson.Raw。
我想念什么?
我尝试做的例子:
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 108 111 32 119 111 114 108 100 0]}
在封送和拆组时,bson.Raw均用作值。
要将an interface{}转换为bson.Raw,首先要做的是将其封送,以便获得表示正被封送的任何内容的纯文本数据:
interface{}
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规范中的文档,它当然必须与提供的数据匹配。由于BSON仅支持最高级别的文档,因此我们知道这是正确的。