【发布时间】:2015-09-01 18:47:17
【问题描述】:
有什么方法可以在 Go 中保持强引用?
鉴于以下令人费解的代码:
package main
import (
"fmt"
)
func main() {
slice := make([]int, 5)
slice[3] = 25 // whatever index between 0 and 4 included I don't care
slicesArray := make([]*[]int, 2)
slicesArray[0] = &slice
fmt.Println((*(slicesArray[0]))[3])
slice = nil
fmt.Println((*(slicesArray[0]))[3])
}
这个程序当然会崩溃,因为一旦将 slice 设置为 nil,垃圾收集器会将内存区域标记为脏。
但是有没有办法告诉 Go 我的切片指针切片应该保持对这些切片的强引用?
此外,保留对切片的引用而不是将 slicesArray 声明为[][]int 是否有任何内存使用增益?是否有任何文档明确说明这应该如何工作?
【问题讨论】:
-
“因为一旦将 slice 设置为 nil,垃圾收集器就会将内存区域标记为脏”,这是不正确的。如果任何代码都有指向某个东西的指针,那么垃圾收集器就会不理会它。您可以整天设置指向
nil的指针,而垃圾收集器不会发生任何事情(除非 被指向的内容现在不再被其他任何东西指向)。