sync.Pool 临时对象池适用于存储那些被分配了但没有使用,而未来可能会使用的值。其目的是为了减少GC的压力。

  1. /**
  2. * sync/pool.go
  3. */
  4. type Pool struct {
  5. noCopy noCopy
  6. local unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal
  7. localSize uintptr // size of the local array
  8. victim unsafe.Pointer // local from previous cycle
  9. victimSize uintptr // size of victims array
  10. // New optionally specifies a function to generate
  11. // a value when Get would otherwise return nil.
  12. // It may not be changed concurrently with calls to Get.
  13. New func() interface{}
  14. }

特性

  1. sync.Pool 是协程安全的(应用于管理协程间共享的变量,不推荐用于管理非协程间共享的对象)。
  2. 从 pool 中取出对象时若 sync.Pool 内没有对象,将执行 New 函数。如果没有对 New 函数赋值,则返回 nil;
  3. 除第一个放入 pool 的值外,其它值采用先进后出的存储原则
  4. pool 中的对象数量是不可控的;
  5. 任何存储在 pool 中的值随时都有可能被销毁,并且在销毁的同时没有任何通知;

    基本用法

    ```go package main

import ( “fmt” “sync” )

func main() { pool := &sync.Pool{ New: func() interface{} { return “default” }}

  1. pool.Put("value")
  2. fmt.Println(pool.Get()) // 输出:value
  3. fmt.Println(pool.Get()) // 输出:default

} ```

经典用例

由于 fmt 包总是需要使用一些 []byte 之类的对象,所以 Go 建立了一个临时对象池来存放这些对象,如果需要使用一个 []byte,就去 pool 里拿,拿不到就分配一份。比起不停地生成[]byte,用完再由 GC 回收要高效的多。