diff options
author | apocelipes <seve3r@outlook.com> | 2024-04-02 13:41:00 +0000 |
---|---|---|
committer | Gopher Robot <gobot@golang.org> | 2024-04-11 16:40:14 +0000 |
commit | 08af216c75a583a198c4ccfe68628c74554ee82f (patch) | |
tree | 3c02d4bd8f1103fec6e353a61028015eae8a3fec /src/encoding | |
parent | 45703b50a6ae557ebe9bd7b1bea8e49d66fc97ee (diff) | |
download | go-08af216c75a583a198c4ccfe68628c74554ee82f.tar.gz go-08af216c75a583a198c4ccfe68628c74554ee82f.zip |
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 <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/encoding')
-rw-r--r-- | src/encoding/json/decode_test.go | 5 | ||||
-rw-r--r-- | 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] |