我有這段代碼:
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 中代碼的鏈接。
uj5u.com熱心網友回復:
x1是一個指向{y:nil}型別的指標X。
x2.y也是指向同一個{y:nil}的指標。所以當你設定x1=nil,x1變成一個 nil 的指標,并且x2.y仍然指向同一個{y:nil}物件。
uj5u.com熱心網友回復:
不,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仍然存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535745.html
標籤:去指针
