diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-01-26 10:26:16 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-01-26 11:07:18 +0100 |
| commit | 55da6462ff4c89d7cb74be37dd5960fb93e0bf32 (patch) | |
| tree | b2a6138c23b4c17d5d38ab9d8d91f300297198c6 /pkg | |
| parent | f4e7270e33225b8f25b74ab9072e9b670f2f82ae (diff) | |
pkg/serializer: do not write field names if it won't save space
If we are going to write all values, don't write field names.
This only increases size of generated files.
The change reduces size of generated files by 5.8%
(62870496-59410354=3460142 bytes saved).
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/serializer/serializer.go | 23 | ||||
| -rw-r--r-- | pkg/serializer/serializer_test.go | 6 |
2 files changed, 22 insertions, 7 deletions
diff --git a/pkg/serializer/serializer.go b/pkg/serializer/serializer.go index 473b6fa74..4de4dc093 100644 --- a/pkg/serializer/serializer.go +++ b/pkg/serializer/serializer.go @@ -57,7 +57,10 @@ func (w *writer) do(v reflect.Value, sliceElem bool) { case reflect.String: fmt.Fprintf(w.w, "%q", v.String()) case reflect.Func: - // Skip, no way to serialize this. + if !v.IsNil() { + panic("no way to serialize funcs") + } + fmt.Fprintf(w.w, "nil") default: panic(fmt.Sprintf("unsupported type: %#v", v.Type().String())) } @@ -111,17 +114,27 @@ func (w *writer) doStruct(v reflect.Value, sliceElem bool) { w.string(v.Type().Name()) } w.byte('{') + fieldNames := false + for i := 0; i < v.NumField(); i++ { + f := v.Field(i) + if isDefaultValue(f) || !f.CanSet() { + fieldNames = true + break + } + } needComma := false for i := 0; i < v.NumField(); i++ { f := v.Field(i) - if isDefaultValue(f) { + if fieldNames && (isDefaultValue(f) || !f.CanSet()) { continue } if needComma { w.byte(',') } - w.string(v.Type().Field(i).Name) - w.byte(':') + if fieldNames { + w.string(v.Type().Field(i).Name) + w.byte(':') + } w.do(f, false) needComma = true } @@ -177,7 +190,7 @@ func isDefaultValue(v reflect.Value) bool { case reflect.String: return v.String() == "" case reflect.Func: - return true + return false default: return false } diff --git a/pkg/serializer/serializer_test.go b/pkg/serializer/serializer_test.go index 06dbaf304..c33b316a9 100644 --- a/pkg/serializer/serializer_test.go +++ b/pkg/serializer/serializer_test.go @@ -13,9 +13,10 @@ func TestSerializer(t *testing.T) { Y: Y{1}, P: &Y{2}, A: []Y{{3}, {4}}, - F: true, + B: true, S: "a\x09b", T: T1, + F: nil, } buf := new(bytes.Buffer) Write(buf, x) @@ -27,9 +28,10 @@ type X struct { Y Y P *Y A []Y - F bool + B bool S string T T + F func() } type Y struct { |
