gpt4 book ai didi

mongodb - 如何将具有自定义 MarshalBSONValue 的结构的 nil 指针序列化为 BSON?

转载 作者:行者123 更新时间:2023-12-01 22:17:04 27 4
gpt4 key购买 nike

我的程序中使用的 mongodb 官方 golang 驱动程序。


package main

import (
"fmt"
"github.com/pkg/errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/bsontype"
"go.mongodb.org/mongo-driver/x/bsonx"
"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
"log"
"strconv"
)

type Bar struct {
a int64
}

func (b Bar) MarshalBSONValue() (bsontype.Type, []byte, error) {
return bsonx.String(fmt.Sprintf("%d", b.a)).MarshalBSONValue()
}

func (b *Bar) UnmarshalBSONValue(t bsontype.Type, data []byte) error {
if t != bsontype.String {
return errors.Errorf("bsontype(%s) not allowed in Bar.UnmarshalBSONValue, only string accept", t.String())
}
str, _, ok := bsoncore.ReadString(data)
if !ok {
return errors.Errorf("decode string, but string not found")
}

dec, err := strconv.ParseInt(str, 10, 64)
if err != nil {
return err
}
b = &Bar{a:dec}
return nil
}

type Foo struct {
Bar *Bar`bson:"Bar, omitempty"`
}

func main() {
f := Foo{}
_, err := bson.Marshal(f)
if err != nil {
log.Fatalf("Failed to marshal. Error: %v", err)
}
}


这个程序会因为错误而 panic :
panic: value method main.Bar.MarshalBSONValue called using nil *Bar pointer

goroutine 1 [running]:
main.(*Bar).MarshalBSONValue(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
<autogenerated>:1 +0x87
reflect.Value.call(0x11ebc60, 0xc000010330, 0x293, 0x1218915, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/reflect/value.go:447 +0x461

最佳答案

您需要在 omitempty 之前删除空格:

type Foo struct {
Bar *Bar`bson:"Bar,omitempty"`
}

解析器无法处理“, omitempty”,因为代码如下:
for idx, str := range strings.Split(tag, ",") {
if idx == 0 && str != "" {
key = str
}
switch str {
case "omitempty":

关于mongodb - 如何将具有自定义 MarshalBSONValue 的结构的 nil 指针序列化为 BSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58944778/

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