Memahami Kaedah Penetap untuk Jenis Struktur
Jenis struktur dalam Go menyediakan cara yang mudah untuk mengumpulkan data berkaitan, dan kaedah penetap membenarkan kami mengubah suai harta benda mereka. Walau bagaimanapun, senario tertentu boleh membawa kepada tingkah laku yang tidak dijangka.
Penerangan Masalah:
Pertimbangkan struct T dengan medan Val dan dua fungsi penetap: SetVal dan SetVal2. Menggunakan SetVal tidak mengubah suai struktur asal, manakala SetVal2 melakukannya. Memahami percanggahan ini adalah penting.
Mekanisme Asas:
Apabila menghantar struct kepada fungsi, dua pendekatan boleh dilakukan:
Penaakulan:
SetVal mengambil struct sebagai parameter nilai. Oleh itu, salinan struct dibuat dalam fungsi, dan sebarang perubahan kepada t (salinan) tidak memberi kesan kepada v asal.
Menyelesaikan Isu:
Gunakan pendekatan penerima penunjuk dalam SetVal2 untuk memastikan pengubahsuaian ditunjukkan dalam asal struct:
func (t *T) SetVal(s string) { t.Val = s }
Pengesahan:
Menambah pernyataan cetakan untuk menunjukkan perbezaan:
type T struct { Val string } func (t T) SetVal(s string) { fmt.Printf("Address of copy is %p\n", &t) } func (t *T) SetVal2(s string) { fmt.Printf("Pointer argument is %p\n", t) } func main() { v := T{"abc"} fmt.Printf("Address of v is %p\n", &v) v.SetVal("pdq") v.SetVal2("xyz") }
Program ini mengeluarkan:
Address of v is 0xf8400cfc00 Address of copy is 0xf8400cfcd0 Pointer argument is 0xf8400cfc00
Alamat v dan penuding dalam SetVal2 adalah sama, mengesahkan penggunaan yang asal struct, manakala SetVal berfungsi pada salinan.
Atas ialah kandungan terperinci Mengapa Kaedah Penetapan Struktur Go Berkelakuan Berbeza Apabila Menggunakan Penerima Nilai berbanding Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!