// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package buffer provides a pool-allocated byte buffer. package buffer import "sync" // buffer adapted from go/src/fmt/print.go type Buffer []byte // Having an initial size gives a dramatic speedup. var bufPool = sync.Pool{ New: func() any { b := make([]byte, 0, 1024) return (*Buffer)(&b) }, } func New() *Buffer { return bufPool.Get().(*Buffer) } func (b *Buffer) Free() { // To reduce peak allocation, return only smaller buffers to the pool. const maxBufferSize = 16 << 10 if cap(*b) <= maxBufferSize { *b = (*b)[:0] bufPool.Put(b) } } func (b *Buffer) Reset() { b.SetLen(0) } func (b *Buffer) Write(p []byte) (int, error) { *b = append(*b, p...) return len(p), nil } func (b *Buffer) WriteString(s string) (int, error) { *b = append(*b, s...) return len(s), nil } func (b *Buffer) WriteByte(c byte) error { *b = append(*b, c) return nil } func (b *Buffer) String() string { return string(*b) } func (b *Buffer) Len() int { return len(*b) } func (b *Buffer) SetLen(n int) { *b = (*b)[:n] }