可以把临时对象池当作针对某种数据的缓存来用。
sync.Pool 有一个 New 字段,初始化池的时候最好给定它。sync.Pool 只有两个方法:Put 和 Get。
当临时对象池中的对象在一段时间内不被使用时,会被 Go 语言运行时系统中的垃圾回收器及时清理掉。
从 sync.Pool 中获取临时对象的步骤:
package main
import (
"bytes"
"fmt"
"io"
"sync"
)
// 数据块缓冲区的临时对象池
var bufPool sync.Pool
// 数据缓冲区接口
type Buffer interface {
Delimiter() byte // 获取数据块之间的定界符
Write(contents string) (err error) // 写一个数据块
Read() (contents string, err error) // 读一个数据块
Free() // 释放当前的缓冲区
}
// 数据块缓冲区实现
type myBuffer struct {
buf bytes.Buffer
delimiter byte
}
func (b *myBuffer) Delimiter() byte {
return b.delimiter
}
func (b *myBuffer) Write(contents string) (err error) {
if _, err = b.buf.WriteString(contents); err != nil {
return
}
return b.buf.WriteByte(b.delimiter)
}
func (b *myBuffer) Read() (contents string, err error) {
return b.buf.ReadString(b.delimiter)
}
func (b *myBuffer) Free() {
bufPool.Put(b)
}
// 定界符
var delimiter = byte('\n')
// 先于 main() 执行
func init() {
bufPool = sync.Pool {
New: func() interface{} {
return &myBuffer{delimiter: delimiter}
},
}
}
// 获取一个数据块缓冲区
func GetBuffer() Buffer {
return bufPool.Get().(Buffer)
}
func main() {
buf := GetBuffer()
defer buf.Free()
buf.Write("A Pool is a set of temporary objects that" +
" may be individuall saved and retrieved.")
buf.Write("A Pool is safe for use by multiple goroutines simultaneously.")
buf.Write("A Pool must not be copied after fisrt use.")
fmt.Println("The data blocks in buffer:")
for {
block, err := buf.Read()
if err != nil {
if err == io.EOF{
break
}
panic(fmt.Errorf("unexpected error: %s", err))
}
fmt.Print(block)
}
}