diff options
| author | Joe Tsai <joetsai@digital-static.net> | 2023-02-06 11:37:39 -0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-03-13 17:03:14 +0000 |
| commit | e671fe0c3efc497397af3362a4b79c895fbd8bfc (patch) | |
| tree | 1280acea678e3eaaa106a34e99e2b147386077b6 /src/bytes/example_test.go | |
| parent | bcd8161f4e3225899981d63def53fbb09b7556d4 (diff) | |
| download | go-e671fe0c3efc497397af3362a4b79c895fbd8bfc.tar.xz | |
bytes: add Buffer.Available and Buffer.AvailableBuffer
This adds a new Buffer.AvailableBuffer method that returns
an empty buffer with a possibly non-empty capacity for use
with append-like APIs.
The typical usage pattern is something like:
b := bb.AvailableBuffer()
b = appendValue(b, v)
bb.Write(b)
It allows logic combining append-like APIs with Buffer
to avoid needing to allocate and manage buffers themselves and
allows the append-like APIs to directly write into the Buffer.
The Buffer.Write method uses the builtin copy function,
which avoids copying bytes if the source and destination are identical.
Thus, Buffer.Write is a constant-time call for this pattern.
Performance:
BenchmarkBufferAppendNoCopy 2.909 ns/op 5766942167.24 MB/s
This benchmark should only be testing the cost of bookkeeping
and never the copying of the input slice.
Thus, the MB/s should be orders of magnitude faster than RAM.
Fixes #53685
Change-Id: I0b41e54361339df309db8d03527689b123f99085
Reviewed-on: https://go-review.googlesource.com/c/go/+/474635
Run-TryBot: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Daniel Martà <mvdan@mvdan.cc>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/bytes/example_test.go')
| -rw-r--r-- | src/bytes/example_test.go | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/bytes/example_test.go b/src/bytes/example_test.go index e5b7b60dbb..41a5e2e5bf 100644 --- a/src/bytes/example_test.go +++ b/src/bytes/example_test.go @@ -11,6 +11,7 @@ import ( "io" "os" "sort" + "strconv" "unicode" ) @@ -37,6 +38,18 @@ func ExampleBuffer_Bytes() { // Output: hello world } +func ExampleBuffer_AvailableBuffer() { + var buf bytes.Buffer + for i := 0; i < 4; i++ { + b := buf.AvailableBuffer() + b = strconv.AppendInt(b, int64(i), 10) + b = append(b, ' ') + buf.Write(b) + } + os.Stdout.Write(buf.Bytes()) + // Output: 0 1 2 3 +} + func ExampleBuffer_Cap() { buf1 := bytes.NewBuffer(make([]byte, 10)) buf2 := bytes.NewBuffer(make([]byte, 0, 10)) |
