小编典典

元帅成野牛

go

使用gopkg.in/mgo.v2/bson,我想知道如何将interface
{}的值编组为type的值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]}


阅读 262

收藏
2020-07-02

共1个答案

小编典典

在封送和拆组时,bson.Raw均用作值。

要将an 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规范中的文档,它当然必须与提供的数据匹配。由于BSON仅支持最高级别的文档,因此我们知道这是正确的。

2020-07-02