1. sync.Pool 的功用
sync.Pool通常被称为,临时对象池。
在频繁地分配和回收内存,会给GC带来一定的负担。
sync.Pool可以将暂时不用的对象缓存起来,下次要需要使用的时候,可以直接使用。
Pool这名字可能会产生误导,Pool里装的对象,会在没有通知的情况下,被回收。用Cache来思考这个功能,会比较直观。
2. sync.Pool类型,有两个方法,Put和Get
A. Get方法,会从当前的池中删除掉任何一个值,然后把这个值做为结果返回。
如果此时当前的池中没有任何值,那么这个方法就会使用当前池的New字段创建一个新值,并将值返回。
B. Put方法,会将临时对象,储存到池中。
3. 初始化临时对象池
sync.Pool类型的New字段代表着创建临时对象的函数。这个函数的类型是没有参数但有唯一结果的函数类型。
func() interface{}
而这个New字段的函数,需要我们在初始化临时对象池的时候就给定。
4. 程式码範例
package mainimport ("fmt""sync")func main() { pool := &sync.Pool{ New: func() interface{} { fmt.Println("Create a new object.") return 10 }, } pool.Put(100) pool.Put(100) pool.Put(100) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(id int) { fmt.Println(pool.Get()) wg.Done() }(i) } wg.Wait()}
https://play.golang.org/p/zHZObADzCg9
说明:
将临时对象100,存放三次,到临时对象池中。
前三个goroutine,会从临时对象池取得100。
之后的goroutine取不到值,就会呼叫New字段的函数。而New函数会回传10。
参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/