kos*_*tix 5

&data[0]data

由于获取数组元素的地址会创建对该内存的引用(只要垃圾收集器需要考虑),您可以安全地让切片本身超出范围,而不必担心该数组的内存无法访问。

唯一不能对结果指针真正做的事情是传递取消引用它的结果。这仅仅是因为 Go 中的数组在它们的类型中编码了它们的长度,所以你将无法创建一个函数来接受这样的数组——因为你事先不知道数组的长度。

现在请停下来想一想。

从切片中提取后备数组后,您就有了一个指向数组内存的指针。为了合理地携带它,您还需要携带数组的长度……但这正是切片所做的:它们将支持数组的地址与其中的数据长度(以及容量)打包在一起。

因此,我真的认为您应该重新考虑您的问题,因为从我的立场来看,我倾向于认为这不是问题。

sync.Pool

更新我想我应该更好地解释

您无法真正处理结果指针传递取消引用它的结果。

少量。

Go 中数组(与切片相反)的一个关键点是数组——就像 Go 中的一切一样——是按值传递 的,对于数组,这意味着它们的数据被复制。

也就是说,如果你有

var a, b [8 * 1024 * 1024]byte
...
b = a
b = a
struct

我真的建议你按照指定的顺序阅读这两篇文章: