go---临时对象池 sync.Pool

可以把临时对象池当作针对某种数据的缓存来用。

sync.Pool 有一个 New 字段,初始化池的时候最好给定它。sync.Pool 只有两个方法:Put 和 Get。

当临时对象池中的对象在一段时间内不被使用时,会被 Go 语言运行时系统中的垃圾回收器及时清理掉。

从 sync.Pool 中获取临时对象的步骤:
go---临时对象池 sync.Pool_第1张图片

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)
	}
}

在这里插入图片描述

你可能感兴趣的:(Go语言核心36讲(郝林)笔记)