Rumah > pembangunan bahagian belakang > Golang > Go Structs: Adakah Dereferencing Mencipta Salinan atau Rujukan?

Go Structs: Adakah Dereferencing Mencipta Salinan atau Rujukan?

DDD
Lepaskan: 2024-11-30 06:48:15
asal
558 orang telah melayarinya

Go Structs: Does Dereferencing Create a Copy or a Reference?

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Sekarang, mari kita periksa output:

&p.color = 0x10434120
&obj.color = 0x10434140   //different than &p.color!
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan