database - 在 Go 中,如何将 bson byte[] 数据解码到结构数组中?

标签 database go struct bson

当结构数组传递到接口(interface){}时,Unmarshal bson byte[] 数据到结构数组中的最佳方法是什么 参数?

出于演示目的,在以下代码中,我在 inStructArr 上使用 bson.Marshal() 来获取 byte[] 类型数据的。这样我就可以使用 bson.Unmarshal(...) 通过管道输入 outStructArr

import "gopkg.in/mgo.v2/bson"

type User struct {
    Name string
}

func DecodeArrData(inStructArr, outStructArr interface{}) {
    inStructArrData, _ := bson.Marshal(inStructArr)
    bson.Unmarshal(inStructArrData, outStructArr) // <-- Error happens here
    // What's the right way of accomplishing this?
}

func Main() {
    outUsers := &[]User{}
    inUsers := []User{User{"A"}, User{"B"}}

    DecodeArrData(inUsers, outUsers)
}

当我这样做时,收到的错误消息是:解码时不支持的文档类型:[]User。这样做的正确方法是什么?

提前致谢!

最佳答案

MarshalUnmarshal 函数适用于 BSON 文档,而不是 BSON 数组。

将 slice 包装在结构中以提供包所需的文档:

func DecodeArrData(inStructArr, outStructArr interface{}) error {
    in := struct{ Data interface{} }{Data: inStructArr}
    inStructArrData, err := bson.Marshal(in)
    if err != nil {
        return err
    }
    var out struct{ Data bson.Raw }
    if err := bson.Unmarshal(inStructArrData, &out); err != nil {
        return err
    }
    return out.Data.Unmarshal(outStructArr)
}

如果您愿意利用 Marshal 函数的未记录功能并向您的应用程序添加一些 BSON 格式知识,那么您可以省略包装器。

Marshal 未公开的功能是将 slice 编码为 BSON 数组。 BSON 数组可以使用 bson.Raw 进行解码。 value 和 Kind 设置数组的 BSON 代码(值 4)和 Data 设置为数组数据:

func DecodeArrData(inStructArr, outStructArr interface{}) error {
    inStructArrData, err := bson.Marshal(inStructArr)
    if err != nil {
        return err
    }
    raw := bson.Raw{Kind: 4, Data: inStructArrData}
    return raw.Unmarshal(outStructArr)
}

关于database - 在 Go 中,如何将 bson byte[] 数据解码到结构数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47321275/

相关文章:

json - GDBM 与简单的 JSON、INI 或 YAML 配置文件

php - 表上的删除和插入与更新行

sql-server - SQL Server 和数据库的 ACID 属性

go - 中间件在没有指定挂载路径的情况下为每个请求执行

调用 http.Get 时 golang panic

c++ - 我如何确定模板参数参数是否是模板内结构中另一个类的实例? C++

swift - 如何在类中定义 "inline struct"而无需先在 swift (以及更多)中声明它?

json - MongoDB 查找嵌套元素

go - 如何检查我的程序是为 32 位还是 64 位处理器编译的?

c++ - 在 C++ 中排列文本输出