假设我有一个这样的函数:
type Foo struct {
F1 int
F2 string
}
func ReturnMiddleElement() *Foo {
foos = [4]Foo{Foo{F1:0,F2:"0",}, Foo{F1:1,F2:"1",}, Foo{F1:2,F2:"2",}, Foo{F1:3,F2:"3",}}
return &(foos[2])
}
这将如何影响 GC?这会阻止整个数组被收集吗?它只会阻止收集该元素吗?考虑到这个用例,我有什么理由应该用这么小的结构来创建一个指针数组吗?
由于您持有指向数组的指针,因此该数组及其所有内容都不会被垃圾收集。这就是为什么slices.Delete将数组末尾清零。
通常你不应该关心这个小内存,直到分析显示这是一个问题。虽然您可以对很多地方进行微观优化,但恕我直言,也许研究一下为什么要构建一个长时间只需要一个元素的数组会更值得。如果您只是暂时需要它,垃圾收集最终会将其作为一个整体收集。
请注意,虽然不建议,但
unsafe.Add(unsafe.Pointer(&foos[2]), unsafe.Sizeof(Foo{}))
是有效的 Go 表达式。