bufferpool.go 665 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package runtime
  2. import (
  3. "io"
  4. "sync"
  5. )
  6. var bufferPool = sync.Pool{
  7. New: func() any {
  8. return new(Buffer)
  9. },
  10. }
  11. // GetBuffer creates and returns a new buffer if the writer is not already a buffer,
  12. // or returns the existing buffer if it is.
  13. func GetBuffer(w io.Writer) (b *Buffer, existing bool) {
  14. if w == nil {
  15. return nil, false
  16. }
  17. b, ok := w.(*Buffer)
  18. if ok {
  19. return b, true
  20. }
  21. b = bufferPool.Get().(*Buffer)
  22. b.Reset(w)
  23. return b, false
  24. }
  25. // ReleaseBuffer flushes the buffer and returns it to the pool.
  26. func ReleaseBuffer(w io.Writer) (err error) {
  27. b, ok := w.(*Buffer)
  28. if !ok {
  29. return nil
  30. }
  31. err = b.Flush()
  32. bufferPool.Put(b)
  33. return err
  34. }