Skip to content

Commit 71f7b39

Browse files
committed
Reuse buffer for default encoder
1 parent 03450fb commit 71f7b39

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

fmt.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ type EscapeFormatter struct {
4747
// If nil, the standard encoding/json.Encoder will be used instead.
4848
marshaler func(interface{}) ([]byte, error)
4949

50+
defaultMarshaler *json.Encoder
51+
defaultMarshalerBuffer *bytes.Buffer
52+
5053
// prefix is indent prefix used by the JSON encoder when Marshaler is nil.
5154
prefix string
5255

@@ -79,11 +82,15 @@ type EscapeFormatter struct {
7982
// values.
8083
func NewEscapeFormatter(opts ...EscapeFormatterOption) *EscapeFormatter {
8184
f := &EscapeFormatter{
82-
mask: "%d",
83-
timeFormat: time.RFC3339Nano,
84-
indent: " ",
85-
valuesPool: newValuesPool(),
85+
mask: "%d",
86+
timeFormat: time.RFC3339Nano,
87+
indent: " ",
88+
valuesPool: newValuesPool(),
89+
defaultMarshalerBuffer: new(bytes.Buffer),
8690
}
91+
f.defaultMarshaler = json.NewEncoder(f.defaultMarshalerBuffer)
92+
f.defaultMarshaler.SetIndent(f.prefix, f.indent)
93+
f.defaultMarshaler.SetEscapeHTML(f.escapeHTML)
8794
f.Configure(opts...)
8895
return f
8996
}
@@ -288,17 +295,14 @@ func (f *EscapeFormatter) Format(vals []interface{}) ([]*Value, error) {
288295
res[i] = f.valuesPool.newRaw(buf)
289296
} else {
290297
// json encode
291-
buf := new(bytes.Buffer)
292-
enc := json.NewEncoder(buf)
293-
enc.SetIndent(f.prefix, f.indent)
294-
enc.SetEscapeHTML(f.escapeHTML)
295-
if err := enc.Encode(v); err != nil {
298+
f.defaultMarshalerBuffer.Reset()
299+
if err := f.defaultMarshaler.Encode(v); err != nil {
296300
return nil, err
297301
}
298302
if f.escapeJSON {
299-
res[i] = f.valuesPool.newRaw(bytes.TrimSpace(buf.Bytes()))
303+
res[i] = f.valuesPool.newRaw(bytes.TrimSpace(f.defaultMarshalerBuffer.Bytes()))
300304
} else {
301-
res[i] = f.valuesPool.formatBytes(bytes.TrimSpace(buf.Bytes()), f.invalid, f.invalidWidth, false)
305+
res[i] = f.valuesPool.formatBytes(bytes.TrimSpace(f.defaultMarshalerBuffer.Bytes()), f.invalid, f.invalidWidth, false)
302306
res[i].Raw = true
303307
}
304308
}

0 commit comments

Comments
 (0)