Go语言中修改ListNode的Next字段为何影响结构体相等性判断?
为什么修改node2.Next会影响temp与node2的相等性判断?
在Go语言中,结构体的相等性判断是逐字段完全匹配的——只要结构体的任意一个字段值不相等,整个结构体就判定为不相等。
结合你的代码来看具体原因:
- 初始化阶段,
temp := node2是把node2的全部值拷贝给temp,此时两者的Val字段都是100,Next指针也都指向同一个node1的内存地址,所以第一次temp == node2的判断成立,会打印Equalssss1。 - 当执行
node2.Next = &(ListNode{1 , nil})时,你其实修改了node2结构体的Next字段值:这个字段是一个指针,现在它指向了新创建的ListNode实例的地址,而temp的Next字段仍然保留着原来指向node1的地址。 - 第二次判断时,temp和node2的
Next字段值(指针地址)已经不同,因此整个结构体的相等性判断不成立,也就不会打印Equalssss2。
你觉得“修改node2.Next不是修改node2本身”是误解——node2是一个结构体,Next是它的核心字段之一,修改这个字段的值就是修改了node2结构体的整体内容,而temp是之前的完整拷贝,两者的字段状态已经不一致,自然无法通过相等性判断。
内容的提问来源于stack exchange,提问作者Bhargav Vanamala N
相关产品推荐
相关产品推荐

