Pool struct 包含一个 New 字段,这个字段的类型是函数 func() interface{}。当调用 Pool 的 Get 方法从池中获取元素,没有更多的空闲元素可返回时,就会调用这个 New 方法来创建新的元素。如果你没有设置 New 字段,没有更多的空闲元素可返回时,Get 方法将返回 nil,表明当前没有可用的元素。
2.Get
如果调用这个方法,就会从 Pool取走一个元素,这也就意味着,这个元素会从 Pool 中移除,返回给调用者。不过,除了返回值是正常实例化的元素,Get 方法的返回值还可能会是一个 nil(Pool.New 字段没有设置,又没有空闲元素可以返回),所以你在使用的时候,可能需要判断。
3.Put
这个方法用于将一个元素返还给 Pool,Pool 会把这个元素保存到池中,并且可以复用。但如果 Put 一个 nil 值,Pool 就会忽略这个值。
Creating a new Person Creating a new Person 我是任务: 9 Creating a new Person Creating a new Person 我是任务: 0 我是任务: 1 我是任务: 8 my Records is [9] 我是任务: 5 my Records is [1] Creating a new Person Creating a new Person Creating a new Person 我是任务: 2 Creating a new Person 我是任务: 4 my Records is [4] my Records is [5] Creating a new Person 我是任务: 7 my Records is [7] my Records is [8] 我是任务: 3 my Records is [3] my Records is [0] 我是任务: 6 my Records is [6] my Records is [2] 9
============================================第10次触发================================== 我是任务: 0 my Records is [0 1 7 6 9 2 9 5 6 5 0] 我是任务: 4 my Records is [0 9 7 2 6 1 9 4] 我是任务: 1 我是任务: 6 我是任务: 7 我是任务: 5 我是任务: 9 my Records is [2 1 2 3 9 2 2 3 7 5 8 5 4 7] my Records is [0 1 7 6 9 2 9 5 6 5 0 6] my Records is [5 0 4 8 4 2 7 3 5] 我是任务: 8 我是任务: 2 my Records is [5 6 5 9 7 4 1 7 2] 我是任务: 3 my Records is [0 9 7 2 6 1 9 4 1] my Records is [5 6 4 8 4 0 3 2 8] my Records is [3 1 3 6 6 3] my Records is [8 8 3 0 3 7 9 0 0 9] 9
type Student struct { Name string Age int32 Remark [1024]byte }
var studentPool = sync.Pool{ New: func()interface{} { returnnew(Student) }, }
Get & Put
1 2 3
stu := studentPool.Get().(*Student) json.Unmarshal(buf, stu) studentPool.Put(stu)
Get() 用于从对象池中获取对象,因为返回值是 interface{},因此需要类型转换。
Put() 则是在对象使用完毕后,返回对象池。
测性能
1 2 3 4 5 6 7 8 9 10 11 12 13 14
funcBenchmarkUnmarshal(b *testing.B) { for n := 0; n < b.N; n++ { stu := &Student{} json.Unmarshal(buf, stu) } }
funcBenchmarkUnmarshalWithPool(b *testing.B) { for n := 0; n < b.N; n++ { stu := studentPool.Get().(*Student) json.Unmarshal(buf, stu) studentPool.Put(stu) } }