gpt4 book ai didi

go - 编码成 bson.Raw

转载 作者:IT王子 更新时间:2023-10-29 01:55:40 30 4
gpt4 key购买 nike

使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com