go之临时对象池Pool

简介

临时对象池在go中对应sync.Pool类型,我们可以把sync.Pool当作存放临时值的容器,此容器是自动伸缩的、高效、线程安全的。
从临时对象池获取对象有两个途径,第一个是Get向池中Put对象,另一个是通过对Pool的公开字段New赋值一个类型为func() interface{}的方法,通过调用该方法获取到的值,该方法是默认调用的,当Pool中没有Put任何对象时,如果你设置了New字段,那么Get到的值就是调用New获取到的值。注意如果你Get到的对象是Put到Pool中的那么Get完之后就会把你Get到的对象从Pool中删除
临时池是对垃圾回收友好的,垃圾回收后,池中的对象将会被清除。
从临时池中Get到的对象是无序的。

例子

func main() {
	//禁用gc,并保证在main函数执行结束前回复gc
	defer debug.SetGCPercent(debug.SetGCPercent(-1))
	var count int32
	newFunc:=func() interface{}{
		return atomic.AddInt32(&count,1)
	}

	pool:=sync.Pool{
		New:newFunc,
	}
	v1:=pool.Get()
	fmt.Printf("value 1: %v\n",v1)

	pool.Put(10)
	pool.Put(11)
	pool.Put(12)
	v2:=pool.Get()
	fmt.Printf("value 2 :%v \n",v2)

	//'垃圾回收临时对象池的影响
	debug.SetGCPercent(100)
	runtime.GC()
	v3:=pool.Get()
	fmt.Printf("value 3: %v\n",v3)
	pool.New=nil
	v4:=pool.Get()
	fmt.Printf("value 4 : %v\n",v4)
}

输出结果为

value 1: 1
value 2 :10 
value 3: 2
value 4 : <nil>
第一行value为1是因为pool中没有put任何对象,只是设置了New关键字,所以默认调用New。
第二行输出10是因为向Pool中put了对象。
第三行输出2是因为调用了垃圾回收后将pool中的对象都回收掉了所以调用New关键字生成的2
第四行为nil是因为pool中没有对象且New关键字也没有对应的生成方法所以只能为nil。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值