[go] encoding/gob: use reflect.Value.IsZero

7 views
Skip to first unread message

Daniel Martí (Gerrit)

unread,
Mar 29, 2023, 6:56:40 PM3/29/23
to goph...@pubsubhelper.golang.org, golang-...@googlegroups.com, Matthew Dempsky, Ian Lance Taylor, Rob Pike, Gopher Robot, golang-co...@googlegroups.com

Daniel Martí submitted this change.

View Change

Approvals: Rob Pike: Looks good to me, approved Gopher Robot: TryBots succeeded Ian Lance Taylor: Looks good to me, but someone else must approve Matthew Dempsky: Looks good to me, but someone else must approve Daniel Martí: Run TryBots
encoding/gob: use reflect.Value.IsZero

The reflect method was added in Go 1.13, in 2019.
gob's own version dates all the way back to 2011.

The behavior appears to be the same, and all tests still pass.
gob does have special cases like always encoding arrays even when they
are the zero value, but that is done via the sendZero boolean field.

Change-Id: I9057b7436963e231fdbf2f6c4b1edb58a2b13305
Reviewed-on: https://go-review.googlesource.com/c/go/+/479397
Reviewed-by: Ian Lance Taylor <ia...@google.com>
Reviewed-by: Matthew Dempsky <mdem...@google.com>
Reviewed-by: Rob Pike <r...@golang.org>
Run-TryBot: Daniel Martí <mv...@mvdan.cc>
TryBot-Result: Gopher Robot <go...@golang.org>
---
M src/encoding/gob/encode.go
1 file changed, 1 insertion(+), 36 deletions(-)

diff --git a/src/encoding/gob/encode.go b/src/encoding/gob/encode.go
index abc7670..5f4d253 100644
--- a/src/encoding/gob/encode.go
+++ b/src/encoding/gob/encode.go
@@ -430,41 +430,6 @@
enc.freeEncoderState(state)
}

-// isZero reports whether the value is the zero of its type.
-func isZero(val reflect.Value) bool {
- switch val.Kind() {
- case reflect.Array:
- for i := 0; i < val.Len(); i++ {
- if !isZero(val.Index(i)) {
- return false
- }
- }
- return true
- case reflect.Map, reflect.Slice, reflect.String:
- return val.Len() == 0
- case reflect.Bool:
- return !val.Bool()
- case reflect.Complex64, reflect.Complex128:
- return val.Complex() == 0
- case reflect.Chan, reflect.Func, reflect.Interface, reflect.Pointer:
- return val.IsNil()
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return val.Int() == 0
- case reflect.Float32, reflect.Float64:
- return val.Float() == 0
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return val.Uint() == 0
- case reflect.Struct:
- for i := 0; i < val.NumField(); i++ {
- if !isZero(val.Field(i)) {
- return false
- }
- }
- return true
- }
- panic("unknown type in isZero " + val.Type().String())
-}
-
// encodeGobEncoder encodes a value that implements the GobEncoder interface.
// The data is sent as a byte array.
func (enc *Encoder) encodeGobEncoder(b *encBuffer, ut *userTypeInfo, v reflect.Value) {
@@ -615,7 +580,7 @@
}
v = v.Addr()
}
- if !state.sendZero && isZero(v) {
+ if !state.sendZero && v.IsZero() {
return
}
state.update(i)

To view, visit change 479397. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: go
Gerrit-Branch: master
Gerrit-Change-Id: I9057b7436963e231fdbf2f6c4b1edb58a2b13305
Gerrit-Change-Number: 479397
Gerrit-PatchSet: 2
Gerrit-Owner: Daniel Martí <mv...@mvdan.cc>
Gerrit-Reviewer: Daniel Martí <mv...@mvdan.cc>
Gerrit-Reviewer: Gopher Robot <go...@golang.org>
Gerrit-Reviewer: Ian Lance Taylor <ia...@google.com>
Gerrit-Reviewer: Matthew Dempsky <mdem...@google.com>
Gerrit-Reviewer: Rob Pike <r...@golang.org>
Gerrit-CC: Ian Lance Taylor <ia...@golang.org>
Gerrit-MessageType: merged
Reply all
Reply to author
Forward
0 new messages