首页 > 后端开发 > Golang > Go 结构:取消引用会创建副本还是引用?

Go 结构:取消引用会创建副本还是引用?

DDD
发布: 2024-11-30 06:48:15
原创
558 人浏览过

Go Structs: Does Dereferencing Create a Copy or a Reference?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板