Go 是否需要在sync.Pool新函数中返回指针类型?

Go 是否需要在sync.Pool新函数中返回指针类型?,go,Go,我在Github上看到了sync.Pool,它说sync.Pool应该只用于指针类型,例如: var TPool = sync.Pool{ New: func() interface{} { return new(T) }, } 这有意义吗?返回T{}怎么样?哪一个是更好的选择,为什么 没有必要。在大多数情况下,它应该是一个指针,因为您希望共享一个对象,而不是复制 在某些用例中,这可以是非指针类型,比如某个外部资源的id。我可以想象一个路径池,用字符串表示装载的磁

我在Github上看到了sync.Pool,它说sync.Pool应该只用于指针类型,例如:

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

这有意义吗?返回T{}怎么样?哪一个是更好的选择,为什么

没有必要。在大多数情况下,它应该是一个指针,因为您希望共享一个对象,而不是复制

在某些用例中,这可以是非指针类型,比如某个外部资源的id。我可以想象一个路径池,用字符串表示装载的磁盘驱动器,其中正在执行一些大型文件操作。

整个同步点。池是为了避免昂贵的分配。大型ish缓冲区等。您分配一些缓冲区,它们保留在内存中,可供重用。因此使用了指针


但在这里,您将在每一步上复制值,这与目的背道而驰。假设您的T是一个普通结构,而不是类似于SliceHeader的东西,这取决于T是什么以及如何使用该值。显示T的定义。这不是重复的,这个问题是关于如何正确使用sync.Pool的。另一个问题是关于分配,一个技术问题。github上是否存在类似的问题,这有意义吗?为什么每个步骤都会复制它?假设GC尚未执行,我认为当我从池中获取现有实例t{}时,它不会进行分配。@cncal值类型就是这样工作的。它们被复制了。您不会从池中获取对象,而是获取其副本。正是因为这个原因,如果你的方法改变了你的结构,它必须有指针接收器。@cncal:事实上,我认为go中的所有内容都是按值传递,按副本传递。只有当你的值是一个指针时,你才不在乎它是另一个指针的副本。我明白了…:。如果T是一片呢?这是一个小建筑。复制不是问题。重要的是它用指针引用的缓冲区。然而,如果我传递一个切片值,它不会因为接口{}类型而被装箱吗?