sync.Pool 临时对象池适用于存储那些被分配了但没有使用,而未来可能会使用的值。其目的是为了减少GC的压力。
/**
* sync/pool.go
*/
type Pool struct {
noCopy noCopy
local unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal
localSize uintptr // size of the local array
victim unsafe.Pointer // local from previous cycle
victimSize uintptr // size of victims array
// New optionally specifies a function to generate
// a value when Get would otherwise return nil.
// It may not be changed concurrently with calls to Get.
New func() interface{}
}
特性
- sync.Pool 是协程安全的(应用于管理协程间共享的变量,不推荐用于管理非协程间共享的对象)。
- 从 pool 中取出对象时若 sync.Pool 内没有对象,将执行 New 函数。如果没有对 New 函数赋值,则返回 nil;
- 除第一个放入 pool 的值外,其它值采用先进后出的存储原则;
- pool 中的对象数量是不可控的;
- 任何存储在 pool 中的值随时都有可能被销毁,并且在销毁的同时没有任何通知;
基本用法
```go package main
import ( “fmt” “sync” )
func main() { pool := &sync.Pool{ New: func() interface{} { return “default” }}
pool.Put("value")
fmt.Println(pool.Get()) // 输出:value
fmt.Println(pool.Get()) // 输出:default
经典用例
由于 fmt 包总是需要使用一些 []byte 之类的对象,所以 Go 建立了一个临时对象池来存放这些对象,如果需要使用一个 []byte,就去 pool 里拿,拿不到就分配一份。比起不停地生成[]byte,用完再由 GC 回收要高效的多。