将指针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
相关产品推荐
相关产品推荐

