From cb3e170ae764856a99160ee1a6cf8f04c8f51e5d Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Thu, 23 Feb 2023 13:28:48 -0800 Subject: [PATCH] encoding/json: rely on reflect.Value.SetZero MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit v.SetZero() is faster than v.Set(reflect.Zero(v.Type())) and was recently added in Go 1.20. Benchmark numbers are largely unchanged since this mainly affects the unmarshaling of large numbers of JSON nulls, which our benchmarks do not heavily exercise. Change-Id: I464f60f63c9027e63a99fd5da92e7ab782018329 Reviewed-on: https://go-review.googlesource.com/c/go/+/471195 Reviewed-by: Johan Brandhorst-Satzkorn TryBot-Result: Gopher Robot Reviewed-by: Than McIntosh Run-TryBot: Joseph Tsai Reviewed-by: Dmitri Shuralyov Auto-Submit: Joseph Tsai Reviewed-by: Daniel Martí --- src/encoding/json/decode.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 7ad66cfeb6..0a1cadf42e 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -577,13 +577,11 @@ func (d *decodeState) array(v reflect.Value) error { if i < v.Len() { if v.Kind() == reflect.Array { - // Array. Zero the rest. - z := reflect.Zero(v.Type().Elem()) for ; i < v.Len(); i++ { - v.Index(i).Set(z) + v.Index(i).SetZero() // zero remainder of array } } else { - v.SetLen(i) + v.SetLen(i) // truncate the slice } } if i == 0 && v.Kind() == reflect.Slice { @@ -688,7 +686,7 @@ func (d *decodeState) object(v reflect.Value) error { if !mapElem.IsValid() { mapElem = reflect.New(elemType).Elem() } else { - mapElem.Set(reflect.Zero(elemType)) + mapElem.SetZero() } subv = mapElem } else { @@ -902,7 +900,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool } switch v.Kind() { case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice: - v.Set(reflect.Zero(v.Type())) + v.SetZero() // otherwise, ignore null for primitives/string } case 't', 'f': // true, false -- 2.50.0