gpt4 book ai didi

pointers - 取消引用结构会返回结构的新副本吗?

转载 作者:IT老高 更新时间:2023-10-28 13:08:43 25 4
gpt4 key购买 nike

为什么当我们使用 (*structObj) 引用结构时,Go 似乎返回 structObj 的新副本,而不是返回原始 structObj< 的相同地址?这可能是我的一些误解,所以我寻求澄清

package main

import (
"fmt"
)

type me struct {
color string
total int
}

func study() *me {
p := me{}
p.color = "tomato"
fmt.Printf("%p\n", &p.color)
return &p
}

func main() {
p := study()
fmt.Printf("&p.color = %p\n", &p.color)

obj := *p
fmt.Printf("&obj.color = %p\n", &obj.color)
fmt.Printf("obj = %+v\n", obj)

p.color = "purple"
fmt.Printf("p.color = %p\n", &p.color)
fmt.Printf("p = %+v\n", p)
fmt.Printf("obj = %+v\n", obj)

obj2 := *p
fmt.Printf("obj2 = %+v\n", obj2)
}

输出

0x10434120
&p.color = 0x10434120
&obj.color = 0x10434140 //different than &p.color!
obj = {color:tomato total:0}
p.color = 0x10434120
p = &{color:purple total:0}
obj = {color:tomato total:0}
obj2 = {color:purple total:0} // we get purple now when dereference again

Go playground

最佳答案

当你写作时

obj := *p

您正在复制 p 指向的 struct 的值(* 取消引用 p)。它类似于:

var obj me = *p

所以obj是一个me类型的新变量,被初始化为*p的值。这会导致 obj 具有不同的内存地址。

请注意,obj if 属于 me 类型,而 p 属于 *me 类型。但它们是不同的值。更改 obj 字段的值不会影响 p 中该字段的值(除非 me 结构中有引用类型作为字段,即 slice 、映射或 channel 。参见 herehere。)。如果您想产生这种效果,请使用:

obj := p
// equivalent to: var obj *me = p

现在 obj 指向与 p 相同的对象。它们本身仍然有不同的地址,但在它们内部保存的是实际 me 对象的相同地址。

关于pointers - 取消引用结构会返回结构的新副本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com