byte_utils.go 545 B

123456789101112131415161718192021222324252627282930313233343536
  1. package proxy
  2. import "sync"
  3. var (
  4. byteSlicePool = sync.Pool{
  5. New: func() interface{} {
  6. return []byte{}
  7. },
  8. }
  9. byteSliceChan = make(chan []byte, 10)
  10. )
  11. func ByteSliceGet(length int) (data []byte) {
  12. select {
  13. case data = <-byteSliceChan:
  14. default:
  15. data = byteSlicePool.Get().([]byte)[:0]
  16. }
  17. if cap(data) < length {
  18. data = make([]byte, length)
  19. } else {
  20. data = data[:length]
  21. }
  22. return data
  23. }
  24. func ByteSlicePut(data []byte) {
  25. select {
  26. case byteSliceChan <- data:
  27. default:
  28. byteSlicePool.Put(data) //nolint:staticcheck
  29. }
  30. }