在 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中文網其他相關文章!