是否必须在sync.Pool New函数中返回指针类型?

时间:2019-01-14 09:55:28

标签: go

我在Github上看到issue,上面写着sync.Pool只能 用于指针类型,例如:

var TPool = sync.Pool{
    New: func() interface{} {
       return new(T)
    },
}

这有意义吗? return T{}呢?哪个是更好的选择,为什么呢?

2 个答案:

答案 0 :(得分:3)

sync.Pool的重点是避免分配(昂贵的)分配。较大的缓冲区等。您分配了一些缓冲区,它们留在内存中,可供重用。因此,使用指针。

但是在这里,您将在每个步骤中复制值,从而达到目的。 (假设您的T是“普通”结构,而不是SliceHeader之类的东西)

答案 1 :(得分:1)

没有必要。在大多数情况下,它是您要共享对象而不是进行复制的指针。

在某些情况下,它可以是非指针类型,例如某些外部资源的ID。我可以想象一个正在执行一些大文件操作的用字符串表示的路径池(安装的磁盘驱动器)。