用指针复用缓存对象可减少堆分配与GC压力,核心是预分配+复用+显式重置;推荐用sync.Pool存储指针并设置New函数返回新指针,每次Get后须调用Reset清空字段,Put前确保已重置。
Go 中频繁创建结构体或大对象(如 map、slice、自定义缓存项)会触发堆分配和 GC 压力。用指针管理缓存对象的核心思路是:**预分配 + 复用 + 显式重置**,而非每次 new 一个新实例。
sync.Pool 是 Go 官方推荐的轻量级对象复用机制,特别适合生命周期短、可复用的缓存对象。它内部存储的是 interface{},但你可以安全地存取指向结构体的指针。
示例:
var itemPool = sync.Pool{
New: func() interface{} {
return &MyCacheItem{} // 返回指针
},
}
func GetCacheItem() *MyCacheItem {
item := itemPool.Get().(*My
CacheItem)
item.Reset() // 自定义重置方法,清空业务字段
return item
}
func PutCacheItem(item *MyCacheItem) {
itemPool.Put(item) // 放回池中,供下次复用
}
当需要更精细控制(如限制最大缓存数、按 key 分片、带 TTL)时,可自己用 map[*T]bool 或 slice[*T] 管理空闲指针。关键点:
不是所有对象都适合指针复用。需确认:
不复杂但容易忽略。