diff options
| author | Than McIntosh <thanm@google.com> | 2019-11-01 10:44:44 -0400 |
|---|---|---|
| committer | Than McIntosh <thanm@google.com> | 2019-11-01 10:45:24 -0400 |
| commit | c0555a2a7a0ca83fdbb55219299fcfe1ff33e4df (patch) | |
| tree | 25c35dc6bf5b8134906338df0f612fbe75089ca7 /src/encoding/json/encode.go | |
| parent | 219922e95b8e49cfb94da9de0c48edb22a2e7054 (diff) | |
| parent | 8405cd3005a5274e80e41676146629c4086b6380 (diff) | |
| download | go-c0555a2a7a0ca83fdbb55219299fcfe1ff33e4df.tar.xz | |
[dev.link] all: merge branch 'master' into dev.link
Fixed a couple of minor conflicts in lib.go and deadcode.go
relating to debug logging.
Change-Id: I58335fc42ab1f1f3409fd8354da4f26419e8fb22
Diffstat (limited to 'src/encoding/json/encode.go')
| -rw-r--r-- | src/encoding/json/encode.go | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index a7473a7eba..b81e505866 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -399,19 +399,22 @@ var ( // newTypeEncoder constructs an encoderFunc for a type. // The returned encoder only checks CanAddr when allowAddr is true. func newTypeEncoder(t reflect.Type, allowAddr bool) encoderFunc { - if t.Implements(marshalerType) { - return marshalerEncoder - } + // If we have a non-pointer value whose type implements + // Marshaler with a value receiver, then we're better off taking + // the address of the value - otherwise we end up with an + // allocation as we cast the value to an interface. if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(marshalerType) { return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false)) } - - if t.Implements(textMarshalerType) { - return textMarshalerEncoder + if t.Implements(marshalerType) { + return marshalerEncoder } if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(textMarshalerType) { return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false)) } + if t.Implements(textMarshalerType) { + return textMarshalerEncoder + } switch t.Kind() { case reflect.Bool: |
