首页 >后端开发 >Golang >Go 结构:取消引用指针时的值复制或引用?

Go 结构:取消引用指针时的值复制或引用?

DDD
DDD原创
2024-11-28 20:54:12149浏览

Go Structs:  Value Copy or Reference When Dereferencing a Pointer?

解引用结构体:了解值复制与引用赋值

在 Go 中使用结构体时,可以使用星号运算符 (*)取消引用结构体指针,引发关于它是否返回相同的结构体值或新副本的问题。让我们通过一个例子来阐明这一点:

考虑以下代码:

type me struct {
    color string
    total int
}

func study() *me {
    p := me{}
    p.color = "tomato"
    return &p
}

在这种情况下,函数 Study() 返回一个指向 me 结构体的指针。当我们在主函数中调用 Study() 并将其分配给 p 时,我们本质上是存储对原始 me 结构的引用。然而,当我们使用 obj := *p 取消引用 p 时,我们正在复制 p 指向的结构体的值。这相当于:

var obj me = *p

因此,obj 成为 me 类型的新变量,使用与 p 指向的结构体相同的数据进行初始化。这意味着 obj 和 p 具有不同的内存地址,即使它们包含相同的数据。

需要注意的是,如果我们对 obj 结构体进行任何更改,它们不会影响 p 指向的数据,除非 me 结构包含引用类型(例如切片、映射或通道)。在这种情况下,对这些字段的更改将反映在 obj 和 p 指向的结构中。

但是,如果我们想要将引用分配给与 p 相同的结构,而不是复制其值,我们可以使用直接赋值:

obj := p

在这种情况下,obj 将保存对与 p 相同的结构的直接引用,并且对 obj 所做的任何更改也将通过p.

以上是Go 结构:取消引用指针时的值复制或引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn