-
Type: Bug
-
Resolution: Works as Designed
-
Priority: Major - P3
-
None
-
Affects Version/s: 1.1.3
-
Component/s: BSON
-
Labels:None
-
Environment:mongo-go-driver 1.1.3 and latest version from github
Go 1.12.7
MacOS Catalina
// code placeholder 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) } }
this program will panic with error:
{{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 +0x87reflect.Value.call(0x11ebc60, 0xc000010330, 0x293, 0x1218915, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, ...)/usr/local/go/src/reflect/value.go:447 +0x461}}