将指针设置为 nil 时,结构指针字段不会改变

我有这段代码:


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 中代码的链接。


繁花如伊
浏览 92回答 2
2回答

四季花海

x1是一个指向{y:nil}类型的指针X。 x2.y也是指向同一个}的指针{y:nil。所以当你设置x1=nil,x1变成一个 nil 的指针,并且x2.y仍然指向同一个{y:nil}对象。

皈依舞

不,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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go