2 回答
TA贡献1811条经验 获得超5个赞
x1
是一个指向{y:nil}
类型的指针X
。 x2.y
也是指向同一个}的指针{y:nil
。所以当你设置x1=nil
,x1
变成一个 nil 的指针,并且x2.y
仍然指向同一个{y:nil}
对象。
TA贡献1851条经验 获得超3个赞
不,x2.y仍将指向您分配给的对象x1。这就是您的代码基本上在做什么:
Objects in memory
| memory address | value |
| 0xDEADBEEF | X{y: nil } |
| 0x1BADB002 | X{y: 0xDEADBEEF } |
|----------------|-------------------|
In your code:
| variable | value |
| x1 | 0xDEADBEEF |
| x2 | 0x1BADB002 |
所以现在通过做x1 = nil,你所做的就是改变变量的值:
| variable | value |
| x1 | nil |
| x2 | 0x1BADB002 |
x2仍然指向内存中的一个值,该值又指向内存中的另一个对象。go 运行时识别到这一点,看到存储的对象0xDEADBEEF仍在使用中,因此不会释放内存。
更直观的表示是这样的:
+-----------+(0xDEADBEEF)
| X{y: nil} |
+-----------+
/\ /\
||-------||--> Both point to the same object
+----+ ||
| x1 | ||
+----+ ||
+----------||------+(0x1BADB002)
| X{y: 0xDEADBEEF} |
+------------------+
/\
|| points to this object
+----+
| x2 |
+----+
通过设置,您所做的只是切断变量和内存中实际对象x1 = nil之间的链接。和那个对象x1之间的联系仍然存在。x2.y
- 2 回答
- 0 关注
- 85 浏览
添加回答
举报