Skip to content

Commit

Permalink
encoding/json: use slices to simplify the code
Browse files Browse the repository at this point in the history
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: 8429bc1
GitHub-Pull-Request: #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>
  • Loading branch information
apocelipes authored and gopherbot committed Apr 11, 2024
1 parent 45703b5 commit 08af216
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 23 deletions.
5 changes: 3 additions & 2 deletions src/encoding/json/decode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"math/big"
"net"
"reflect"
"slices"
"strconv"
"strings"
"testing"
Expand Down Expand Up @@ -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)
}
}
Expand All @@ -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)
}
}
Expand Down
25 changes: 4 additions & 21 deletions src/encoding/json/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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]
Expand Down

0 comments on commit 08af216

Please sign in to comment.