在 Go 中,如何将 bson byte[] 数据解组为结构数组?
In Go, how to Unmarshal bson byte[] data into an array of structs?
当结构数组传递到 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)
}
当我这样做时,我收到的错误消息是:Unsupported document type for unmarshalling: []User
。这样做的正确方法是什么?
提前致谢!
Marshal
和 Unmarshal
函数适用于 BSON 文档,不适用于 BSON 数组。
将切片包装在结构中以提供包所需的文档:
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
的未记录特征是它将切片编码为 BSON 数组。可以使用 bson.Raw 值解码 BSON 数组,其中 Kind 设置数组的 BSON 代码(值 4)并将数据设置为数组数据:
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)
}
当结构数组传递到 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)
}
当我这样做时,我收到的错误消息是:Unsupported document type for unmarshalling: []User
。这样做的正确方法是什么?
提前致谢!
Marshal
和 Unmarshal
函数适用于 BSON 文档,不适用于 BSON 数组。
将切片包装在结构中以提供包所需的文档:
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
的未记录特征是它将切片编码为 BSON 数组。可以使用 bson.Raw 值解码 BSON 数组,其中 Kind 设置数组的 BSON 代码(值 4)并将数据设置为数组数据:
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)
}