From 08af216c75a583a198c4ccfe68628c74554ee82f Mon Sep 17 00:00:00 2001 From: apocelipes Date: Tue, 2 Apr 2024 13:41:00 +0000 Subject: [PATCH] encoding/json: use slices to simplify the code Use "slices.Equal" instead of "reflect.DeepEqual". Replace unnecessary helper type "byIndex" with "slices.SortFunc". No effect on benchmarks. Change-Id: I1fb2768ea6d9db7f487408fa109343be3f1741d5 GitHub-Last-Rev: 8429bc145272ae620fcd001b1de393bf3c0b6108 GitHub-Pull-Request: golang/go#66646 Reviewed-on: https://go-review.googlesource.com/c/go/+/575715 Reviewed-by: qiu laidongfeng2 <2645477756@qq.com> Auto-Submit: Ian Lance Taylor LUCI-TryBot-Result: Go LUCI Reviewed-by: Carlos Amedee Reviewed-by: Ian Lance Taylor --- src/encoding/json/decode_test.go | 5 +++-- src/encoding/json/encode.go | 25 ++++--------------------- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index a10c1e1ebb..f5b44677b3 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -14,6 +14,7 @@ import ( "math/big" "net" "reflect" + "slices" "strconv" "strings" "testing" @@ -1998,7 +1999,7 @@ func TestByteKind(t *testing.T) { if err != nil { t.Fatalf("Unmarshal error: %v", err) } - if !reflect.DeepEqual(got, want) { + if !slices.Equal(got, want) { t.Fatalf("Marshal/Unmarshal mismatch:\n\tgot: %v\n\twant: %v", got, want) } } @@ -2017,7 +2018,7 @@ func TestSliceOfCustomByte(t *testing.T) { if err != nil { t.Fatalf("Unmarshal error: %v", err) } - if !reflect.DeepEqual(got, want) { + if !slices.Equal(got, want) { t.Fatalf("Marshal/Unmarshal mismatch:\n\tgot: %v\n\twant: %v", got, want) } } diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index d6f6900dc9..0035a65cfc 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -1042,25 +1042,6 @@ type field struct { encoder encoderFunc } -// byIndex sorts field by index sequence. -type byIndex []field - -func (x byIndex) Len() int { return len(x) } - -func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byIndex) Less(i, j int) bool { - for k, xik := range x[i].index { - if k >= len(x[j].index) { - return false - } - if xik != x[j].index[k] { - return xik < x[j].index[k] - } - } - return len(x[i].index) < len(x[j].index) -} - // typeFields returns a list of fields that JSON should recognize for the given type. // The algorithm is breadth-first search over the set of structs to include - the top struct // and then any reachable anonymous structs. @@ -1195,7 +1176,7 @@ func typeFields(t reflect.Type) structFields { if x[i].tag != x[j].tag { return x[i].tag } - return byIndex(x).Less(i, j) + return slices.Compare(x[i].index, x[j].index) == -1 }) // Delete all fields that are hidden by the Go rules for embedded fields, @@ -1227,7 +1208,9 @@ func typeFields(t reflect.Type) structFields { } fields = out - sort.Sort(byIndex(fields)) + slices.SortFunc(fields, func(i, j field) int { + return slices.Compare(i.index, j.index) + }) for i := range fields { f := &fields[i] -- 2.48.1