37 lines
524 B
Go
37 lines
524 B
Go
|
package utils
|
||
|
|
||
|
import "sync"
|
||
|
|
||
|
var (
|
||
|
byteSlicePool = sync.Pool{
|
||
|
New: func() interface{} {
|
||
|
return []byte{}
|
||
|
},
|
||
|
}
|
||
|
byteSliceChan = make(chan []byte, 10)
|
||
|
)
|
||
|
|
||
|
func ByteSliceGet(length int) (data []byte) {
|
||
|
select {
|
||
|
case data = <-byteSliceChan:
|
||
|
default:
|
||
|
data = byteSlicePool.Get().([]byte)[:0]
|
||
|
}
|
||
|
|
||
|
if cap(data) < length {
|
||
|
data = make([]byte, length)
|
||
|
} else {
|
||
|
data = data[:length]
|
||
|
}
|
||
|
|
||
|
return data
|
||
|
}
|
||
|
|
||
|
func ByteSlicePut(data []byte) {
|
||
|
select {
|
||
|
case byteSliceChan <- data:
|
||
|
default:
|
||
|
byteSlicePool.Put(data)
|
||
|
}
|
||
|
}
|