Golang简单的对象池

Posted by 聪少 on 2018-04-25
  • 复用的好处
    • 减少gc压力
    • 减少不必要的内存分配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

import (
"fmt"
"sync"
)

var bufPool sync.Pool

type buf struct {
b []byte
}

func main() {
for {
var bf *buf
// 从池中取数据
v := bufPool.Get()
if v == nil {
//若不存在buf,创建新的
fmt.Println("no buf ,create!")
bf = &buf{
b: make([]byte, 10),
}
} else {
// 池里存在buf,v这里是interface{},需要做类型转换
bf = v.(*buf)
}
fmt.Println("使用数据", bf)
// bf使命完成,放入池中
bufPool.Put(bf)
}
}

把上面的代码封装成一个漂亮的接口来使用,是不是非常nice,一般在服务上线之前配合golang官方pprof工具去定位是否有gc压力问题,这里只是解决gc压力的冰山一角。

OK! See you!