为了账号安全,请及时绑定邮箱和手机立即绑定

元帅变成了bson.Raw

元帅变成了bson.Raw

Go
繁华开满天机 2021-08-10 14:59:30
使用gopkg.in/mgo.v2/bson,我想知道如何将 interface{} 值编组为 type 的值bson.Raw。该文档的bson.Raw状态:使用这种类型可以部分解组或编组值。但是我找不到会返回bson.Raw.我错过了什么?我尝试做的示例:package mainimport (    "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]}
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

bson.Raw在编组和解组时都用作值。


要将 aninterface{}转换为 a 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 规范中的一个文档,它当然必须匹配提供的数据。由于 BSON 只支持顶层文档,我们知道这一定是正确的。


查看完整回答
反对 回复 2021-08-10
?
忽然笑

TA贡献1806条经验 获得超5个赞

我相信 bson.Raw 旨在用作变量的类型。


例如:(在玩)


type Bar struct {

   AnInt int

   AString bson.Raw

}

“AString”字段将保留为您的链接提到的 bson.Raw 结构。


如果您想部分解码嵌套结构的顶层以找出其实际类型,这将非常有用,以便您可以将其余部分解析为正确的数据类型。


请注意,以上内容未经测试,不在我目前可以实际运行的机器前。这是基于它像标准 encoding/json 包一样工作的假设。


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信