You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将指针x1设为nil后,为何结构体x2的指针字段y未变为nil?

Go指针赋值后修改原变量不影响副本的原因

先看你写的代码:

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
}

原因解释

在Go语言中,指针变量的本质是存储目标值的内存地址。当你把x1赋值给x2.y时,x2.y只是复制了x1当时指向的内存地址——此时x1和x2.y是两个独立的变量,只是暂时指向同一块内存。

当你执行x1 = nil时,只是修改了x1这个变量本身的值,让它不再指向任何内存地址,但x2.y里存储的还是最初那个X结构体实例的地址,所以它不会跟着变成nil。

打个比方:你和朋友各持一张写着同一家餐厅地址的纸条。你把自己的纸条擦成空白(对应x1 = nil),但朋友手里的纸条还是原来的餐厅地址,不会受你的动作影响。

内容的提问来源于stack exchange,提问作者Mojtaba Arezoomand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:50:41