mirror of
https://github.com/mikefarah/yq.git
synced 2026-08-24 00:04:50 +08:00
writeString converted every string to []byte before calling io.Writer.Write, which Go escape analysis reports as escaping to the heap. io.WriteString uses the io.StringWriter fast path when available (the standard printer writer is a *bufio.Writer) and falls back to Write([]byte(txt)) otherwise. Fixes #2807 Co-authored-by: Pablo Garcia <pablito@MacBook-Neo-de-Pablo.local>
42 lines
1004 B
Go
42 lines
1004 B
Go
package yqlib
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"io"
|
|
"testing"
|
|
|
|
"github.com/mikefarah/yq/v4/test"
|
|
)
|
|
|
|
// plainWriter only implements io.Writer, so io.WriteString must fall back to Write.
|
|
type plainWriter struct {
|
|
buf bytes.Buffer
|
|
}
|
|
|
|
func (w *plainWriter) Write(p []byte) (int, error) {
|
|
return w.buf.Write(p)
|
|
}
|
|
|
|
func TestWriteStringToStringWriter(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
writer := bufio.NewWriter(&buf)
|
|
test.AssertResult(t, nil, writeString(writer, "hello world"))
|
|
test.AssertResult(t, nil, writer.Flush())
|
|
test.AssertResult(t, "hello world", buf.String())
|
|
}
|
|
|
|
func TestWriteStringToPlainWriter(t *testing.T) {
|
|
writer := &plainWriter{}
|
|
test.AssertResult(t, nil, writeString(writer, "hello world"))
|
|
test.AssertResult(t, "hello world", writer.buf.String())
|
|
}
|
|
|
|
func TestWriteStringDoesNotAllocate(t *testing.T) {
|
|
writer := bufio.NewWriter(io.Discard)
|
|
allocations := testing.AllocsPerRun(100, func() {
|
|
_ = writeString(writer, "hello world")
|
|
})
|
|
test.AssertResult(t, 0.0, allocations)
|
|
}
|