Adakah Dereferencing Struct Mencipta Salinan Baharu dalam Go?
In Go, apabila pembolehubah jenis struct diluluskan melalui rujukan menggunakan pengendali asterisk (*), salah tanggapan mungkin timbul bahawa pembolehubah yang dinyahrujuk mewakili alamat yang sama seperti alamat asal struct.
Walau bagaimanapun, seperti yang ditunjukkan dalam coretan kod yang diberikan:
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) }
Apabila kita melaksanakan kod ini, output menunjukkan bahawa obj pembolehubah yang dinyahrujuk mempunyai alamat yang berbeza daripada struct p asal . Ini kerana:
Dereferencing mencipta salinan baharu:
Baris obj := *p mencipta obj pembolehubah baharu daripada jenis yang sama seperti p (me), dan memulakannya dengan salinan nilai yang ditunjuk oleh p. Ini bermakna bahawa sebarang perubahan yang dibuat pada obj tidak akan menjejaskan struct asal.
Berkesan memberikan nilai struct baharu kepada yang lain:
Serupa dengan var obj me = *p , operasi penyahrujukan dalam obj := *p memberikan nilai struct baharu kepada obj pembolehubah. Ini mencipta salinan baharu dengan memori yang berasingan.
Menggunakan operator asterisk dengan berhati-hati:
Walaupun pengendali asterisk menyediakan semantik penunjuk, adalah penting untuk memahami kesannya terhadap pembolehubah . Apabila nilai diberikan dengan operator * (dereference), ia mencipta salinan baharu, bukan rujukan baharu kepada pembolehubah asal.
Atas ialah kandungan terperinci Adakah Dereferencing a Go Struct Mencipta Salinan Baharu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!