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

本文介绍如何使用Go语言中的sync.Pool实现临时对象的管理和复用,通过一个数据块缓冲区的例子展示了临时对象池的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值