This change adds a a check in the encodeWithString.resolve method
to ensure that a reflect.Value with kind Ptr is not nil before
the type assertion to TextMarshaler.
If the value is nil, the method returns a nil error, and the map key
encodes to an empty string.
Fixes #33675
Change-Id: I0a04cf690ae67006f6a9c5f8cbb4cc99d236bca8
GitHub-Last-Rev:
6c987c90846f854e21814dbfb3a073605ec8a94c
GitHub-Pull-Request: golang/go#33700
Reviewed-on: https://go-review.googlesource.com/c/go/+/190697
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
return nil
}
if tm, ok := w.v.Interface().(encoding.TextMarshaler); ok {
+ if w.v.Kind() == reflect.Ptr && w.v.IsNil() {
+ return nil
+ }
buf, err := tm.MarshalText()
w.s = string(buf)
return err
}
}
+// https://golang.org/issue/33675
+func TestNilMarshalerTextMapKey(t *testing.T) {
+ b, err := Marshal(map[*unmarshalerText]int{
+ (*unmarshalerText)(nil): 1,
+ &unmarshalerText{"A", "B"}: 2,
+ })
+ if err != nil {
+ t.Fatalf("Failed to Marshal *text.Marshaler: %v", err)
+ }
+ const want = `{"":1,"A:B":2}`
+ if string(b) != want {
+ t.Errorf("Marshal map with *text.Marshaler keys: got %#q, want %#q", b, want)
+ }
+}
+
var re = regexp.MustCompile
// syntactic checks on form of marshaled floating point numbers.