Go 中解引用结构:揭示复制与引用
在 Go 中,使用 * 运算符解引用结构可能会返回一个新值结构的副本而不是原始地址。这可能会导致误解。
考虑以下代码:
type me struct { color string total int }
在这段代码中,我们定义了一个名为 me 的结构体。
在 Study 函数中,我们创建一个 me struct p 并初始化它的颜色字段。然后我们使用 &p 返回 p 的地址。
func study() *me { p := me{} p.color = "tomato" return &p }
在 main 函数中,我们获取 p.color 的地址并将其存储在 &p.color 中。然后我们取消引用 p 并将结果存储在 obj 中。
func main() { p := study() obj := *p }
现在,让我们检查输出:
&p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color!
当我们比较 &p.color 和 &obj.color 时,我们发现他们有不同的地址。这可能表明,当我们取消引用 p 时,我们创建了该结构的新副本。
但是,情况并非如此。当我们使用 *p 时,我们正在复制 p 指向的结构体的值。相当于使用:
var obj me = *p
obj 是一个 me 类型的新变量,初始化为 *p 的值。这导致 obj 有一个单独的内存地址。
需要注意的是 obj 是 me 类型,而 p 是 *me 类型。它们是不同的价值观。更改 obj 字段不会影响 p 内的字段。
如果我们想修改原始结构体,可以使用:
obj := p // equivalent to: var obj *me = p
在这种情况下,obj 指向同一个对象作为p。它们具有不同的地址,但在实际的 me 对象中保存相同的地址。
以上是Go 结构:取消引用会创建副本还是引用?的详细内容。更多信息请关注PHP中文网其他相关文章!