OSDN Git Service

new repo
[bytom/vapor.git] / encoding / bufpool / bufpool.go
1 // Package bufpool is a freelist for bytes.Buffer objects.
2 package bufpool
3
4 import (
5         "bytes"
6         "sync"
7 )
8
9 var pool = &sync.Pool{New: func() interface{} { return bytes.NewBuffer(nil) }}
10
11 // Get returns an initialized bytes.Buffer object.
12 // It is like new(bytes.Buffer) except it uses the free list.
13 // The caller should call Put when finished with the returned object.
14 // Since Buffer.Bytes() returns the buffer's underlying slice,
15 // it is not safe for that slice to escape the caller.
16 // If the bytes need to escape, CopyBytes should be used.
17 func Get() *bytes.Buffer {
18         return pool.Get().(*bytes.Buffer)
19 }
20
21 // Put resets the buffer and adds it to the freelist.
22 func Put(b *bytes.Buffer) {
23         b.Reset()
24         pool.Put(b)
25 }
26
27 // CopyBytes returns a copy of the bytes contained in the buffer.
28 // This slice is safe from updates in the underlying buffer,
29 // allowing the buffer to be placed back in the free list.
30 func CopyBytes(buf *bytes.Buffer) []byte {
31         b := buf.Bytes()
32         b2 := make([]byte, len(b))
33         copy(b2, b)
34         return b2
35 }