Go 编组到一个bson.Raw

Go 编组到一个bson.Raw,go,marshalling,bson,mgo,Go,Marshalling,Bson,Mgo,使用,我想知道如何将接口{}值封送到类型为bson.Raw的值中 对于bson.Raw状态: 使用此类型可以部分解组或封送值 但是我找不到返回bson.Raw的封送处理函数 我错过了什么 我尝试做的示例: package main import ( "fmt" "gopkg.in/mgo.v2/bson" ) func main() { // How to avoid a MarshalRaw help function? raw, err := Marsh

使用,我想知道如何将接口{}值封送到类型为
bson.Raw
的值中

对于
bson.Raw
状态:

使用此类型可以部分解组或封送值

但是我找不到返回
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
}
输出:

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数据:[120 0 0 72 101 108 111 32 119 111 114 108 100 0]}


我认为bson.Raw旨在用作变量的类型

例如:(in)

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

如果您希望对嵌套结构的顶层进行部分解码,以确定其实际类型,以便将其余部分解析为适当的数据类型,那么这非常有用


请注意,以上内容未经测试,而不是在我目前可以实际运行的机器前。这是基于这样一种假设,即它的工作原理类似于标准编码/json包。

我认为bson.Raw旨在用作变量的类型

例如:(in)

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

如果您希望对嵌套结构的顶层进行部分解码,以确定其实际类型,以便将其余部分解析为适当的数据类型,那么这非常有用

请注意,以上内容未经测试,而不是在我目前可以实际运行的机器前。这是基于这样的假设,即它的工作方式与标准编码/json包类似。

在封送和解封送时都用作值

要将
接口{}
转换为
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.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只支持顶层文档,我们知道这一定是正确的。

是的,这也是我的意图,涵盖了结构的部分解组。但是,当您想在数据库中插入
值时,您需要设置
AString
值。如何从普通字符串(或任何其他类型)创建此
bson.Raw
值?毕竟,文档中提到了“部分封送值”,而使用单独的结构(
Foo
)进行封送的解决方案并不是“部分”。我添加了一个解决方案示例。但它并不漂亮。是的,这也是我的意图,涵盖了结构的部分解组。但是,当您想在数据库中插入
值时,您需要设置
AString
值。如何从普通字符串(或任何其他类型)创建此
bson.Raw
值?毕竟,文档中提到了“部分封送值”,而使用单独的结构(
Foo
)进行封送的解决方案并不是“部分”。我添加了一个解决方案示例。但这并不漂亮。