Go 中解引用结构:创建新副本
在 Go 中使用结构时,了解解引用的行为非常重要。取消引用一个对象本质上会返回它所指向的值的副本。对于一些来自其他语言的程序员来说,这可能是违反直觉的,在这些语言中,取消引用通常会返回对象本身。
考虑以下 Go 代码片段:
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) }
在此示例中,study()函数创建一个新的 me 结构并返回指向它的指针。然后我们将这个指针赋给变量 p。当我们取消引用 p 并将其分配给 obj 时,我们创建了该结构的一个新副本。这个新副本与 p 指向的原始结构体具有不同的内存地址。
这意味着更改 obj 的字段不会影响原始结构体的字段,反之亦然。要创建对原始结构的引用,我们需要将指针从 p 分配给 obj:
obj := p
在这种情况下,obj 和 p 将指向相同的结构,并且对其中之一所做的任何更改都会反映在对方身上。
以上是取消引用 Go 结构会创建副本还是引用?的详细内容。更多信息请关注PHP中文网其他相关文章!