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

问题描述 投票:0回答:1

我的程序中使用的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: 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

mongodb go bson mongo-go
1个回答
1
投票

您需要在省略之前删除空格:

© www.soinside.com 2019 - 2024. All rights reserved.