为了账号安全,请及时绑定邮箱和手机立即绑定

将指针设置为 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 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信