sync.Pool 用于缓存
1. pool 可以减少GC对高并发的性能影响
2. 提供了对象重用
3. 并发安全
4. 仅受限于内存大小
5. 减少GC
6. 对象被删除时不会通知
7. 动态扩容或者收缩
package main
import (
"log"
"sync"
)
func main() {
var intPool = sync.Pool{}
for i := 0; i < 5; i++ {
intPool.Put(i)
}
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
}

上面的例子中如果pool被pop空了, 会直接返回nil
可以通过添加New方法来控制这种行为
package main
import (
"log"
"sync"
)
func main() {
var intPool = sync.Pool{New: func() interface{} {
return "Hello world"
}}
for i := 0; i < 5; i++ {
intPool.Put(i)
}
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
log.Println(intPool.Get())
}

interface{}作为Go的重要特性之一,它代表的是一个类似*void
的指针,可以指向不同类型的数据