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 關注
- 118 瀏覽
添加回答
舉報