Struktur Dereferencing dalam Go: Membongkar Penyalinan lwn. Rujukan
Dalam Go, membatalkan rujukan struct menggunakan operator * mungkin kelihatan mengembalikan yang baharu salinan struct dan bukannya alamat asal. Ini boleh membawa kepada salah faham.
Pertimbangkan kod berikut:
type me struct { color string total int }
Dalam kod ini, kami mentakrifkan struct bernama saya.
Dalam fungsi kajian, kami mencipta a me struct p dan mulakan medan warnanya. Kami kemudian mengembalikan alamat p menggunakan &p.
func study() *me { p := me{} p.color = "tomato" return &p }
Dalam fungsi utama, kami mendapat alamat p.color dan menyimpannya dalam &p.color. Kami kemudiannya menyahrujuk p dan menyimpan hasilnya dalam obj.
func main() { p := study() obj := *p }
Sekarang, mari kita periksa output:
&p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color!
Apabila kita membandingkan &p.color dan &obj.color, kita dapati bahawa mereka mempunyai alamat yang berbeza. Ini mungkin mencadangkan bahawa apabila kita menyahrujuk p, kita mencipta salinan baharu struct.
Walau bagaimanapun, ini tidak berlaku. Apabila kita menggunakan *p, kita menyalin nilai struct yang ditunjuk oleh p. Ia bersamaan dengan menggunakan:
var obj me = *p
obj ialah pembolehubah baharu jenis saya, dimulakan kepada nilai *p. Ini menyebabkan obj mempunyai alamat memori yang berasingan.
Adalah penting untuk ambil perhatian bahawa obj adalah jenis saya, manakala p adalah jenis *saya. Mereka adalah nilai yang berbeza. Menukar medan obj tidak akan menjejaskan medan dalam p.
Jika kita ingin mengubah suai struct asal, kita boleh menggunakan:
obj := p // equivalent to: var obj *me = p
Dalam kes ini, obj menunjuk ke objek yang sama sebagai p. Mereka mempunyai alamat yang berbeza tetapi memegang alamat yang sama dalam objek saya sebenar.
Atas ialah kandungan terperinci Go Structs: Adakah Dereferencing Mencipta Salinan atau Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!