在 Go 中解引用结构体会创建新副本吗?
在 Go 中,当结构体类型的变量通过引用传递时,使用星号 (*) 运算符,可能会产生误解,认为取消引用的变量表示与原始变量相同的地址struct.
但是,如给定的代码片段所示:
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) // Address of p.color return &p } func main() { p := study() // p is a pointer to a struct fmt.Printf("&p.color = %p\n", &p.color) // Address of p.color obj := *p // obj is a copy of the struct pointed to by p fmt.Printf("&obj.color = %p\n", &obj.color) // Address of obj.color fmt.Printf("obj = %+v\n", obj) p.color = "purple" // Changes color of the struct pointed by p fmt.Printf("p.color = %p\n", &p.color) fmt.Printf("p = %+v\n", p) fmt.Printf("obj = %+v\n", obj) obj2 := *p // Another copy is made fmt.Printf("obj2 = %+v\n", obj2) }
当我们执行此代码时,输出显示取消引用的变量 obj 的地址与原始 struct p 的地址不同。这是因为:
取消引用会创建一个新副本:
行 obj := *p 创建一个与 p (me) 类型相同的新变量 obj,并使用 p 指向的值的副本对其进行初始化。这意味着对 obj 所做的任何更改都不会影响原始结构。
有效地将新的结构值分配给另一个:
类似于 var obj me = *p , obj := *p 中的解引用操作将一个新的结构体值赋给变量 obj。这将创建一个具有单独内存的新副本。
谨慎使用星号运算符:
虽然星号运算符提供了指针语义,但了解其对变量的影响非常重要。当使用 *(取消引用)运算符分配值时,它会创建一个新副本,而不是对原始变量的新引用。
以上是取消引用 Go 结构会创建新副本吗?的详细内容。更多信息请关注PHP中文网其他相关文章!