我有这样的代码:
type X struct {
y *X
}
func main() {
x1 := &X{y: nil}
x2 := &X{y: x1}
fmt.Println(x1 == x2.y)
// true
x1 = nil
fmt.Println(x1 == nil)
fmt.Println(x2.y == nil)
// true
// false
}
正如你所看到的x.y
是一个*X
。
为什么将x1
设置为nil
后,x2.y
的值不会变为nil
?
如果我的问题太傻了,对不起。
下面是Go语言中代码的link。
2条答案
按热度按时间ivqmmu1c1#
x1
是指向X
类型的{y:nil}
的指针。x2.y
也是指向同一个{y:nil
的指针}。因此,当您设置x1=nil
时,x1
将成为一个为空的指针,而x2.y
仍指向同一个{y:nil}
对象。3pmvbmvn2#
不,
x2.y
仍然会指向您分配给x1
的对象。这是您的代码的基本功能:所以现在通过执行
x1 = nil
,你所做的就是改变一个变量的值:x2
仍然指向内存中的一个值,而这个值又指向内存中的另一个对象,go运行时会识别出这一点,并发现存储在0xDEADBEEF
中的对象仍在使用中,所以它不会释放内存。更直观的表示形式如下所示:
通过设置
x1 = nil
,我们所做的只是切断了变量x1
和内存中实际对象之间的链接,而x2.y
和该对象之间的链接仍然存在。