程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

go sync.Pool简介(go system)

balukai 2025-07-14 14:50:23 文章精选 3 ℃

sync.Pool 是 Go 提供的一个轻量级对象池,用于缓存和复用临时对象,减少 GC 压力。适合用于频繁创建销毁但生命周期较短的对象,比如:[]byte、临时结构体等。

下面是一个简单示例,展示如何使用 sync.Pool:

示例:复用临时 []byte 缓冲区

package main

import (
	"fmt"
	"sync"
)

func main() {
	// 创建一个 Pool,用于缓存 []byte
	bytePool := sync.Pool{
		New: func() interface{} {
			fmt.Println("创建新对象")
			return make([]byte, 1024) // 1KB 缓冲区
		},
	}

	// 从 Pool 中获取一个对象(第一次会触发 New)
	buf1 := bytePool.Get().([]byte)
	copy(buf1, "Hello Pool")
	fmt.Println(string(buf1[:10]))

	// 用完后放回 Pool
	bytePool.Put(buf1)

	// 再次获取,会复用前面的对象(不会再次调用 New)
	buf2 := bytePool.Get().([]byte)
	fmt.Println("再次获取:", string(buf2[:10]))

	// 输出:
	// 创建新对象
	// Hello Pool
	// 再次获取: Hello Pool
}

关键点说明:

操作

说明

Get()

从池中取对象。若池为空,则调用 New() 创建一个。

Put(x)

把对象放回池中,供下次使用。注意,放回前不自动清理。

New

是一个可选的工厂方法,Get() 时用来创建新对象。

使用注意事项:

  • sync.Pool 主要用于 减少临时对象的 GC 开销,不是通用的连接池。
  • 存入和取出都要在并发安全环境中使用(sync.Pool 本身是线程安全的)。
  • 对象放入后,不能依赖它长期保留 —— GC 可能随时回收池中对象。

Tags:

最近发表
标签列表