亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將指針設置為 nil 時,結構指針字段不會改變

將指針設置為 nil 時,結構指針字段不會改變

Go
繁花如伊 2023-03-15 14:47:36
我有這段代碼: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 playground 中代碼的鏈接。
查看完整描述

2 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

x1是一個指向{y:nil}類型的指針X。 x2.y也是指向同一個}的指針{y:nil。所以當你設置x1=nil,x1變成一個 nil 的指針,并且x2.y仍然指向同一個{y:nil}對象。



查看完整回答
反對 回復 2023-03-15
?
皈依舞

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


查看完整回答
反對 回復 2023-03-15
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號