解引用结构体:了解值复制与引用赋值
在 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中文网其他相关文章!