Mengalih keluar Elemen daripada Slice dalam Struct (Diselesaikan)
Dalam coretan kod yang disediakan, terdapat isu semasa cuba mengalih keluar elemen daripada kepingan dalam struct menggunakan penerima nilai. Ini membawa kepada pengubahsuaian hirisan yang salah dalam struktur asal.
Untuk menyelesaikan masalah ini, penerima penuding mesti digunakan dalam kaedah yang mengubah suai hirisan. Ini kerana penerima nilai Go mencipta salinan nilai penerima, yang bermaksud sebarang perubahan yang dibuat kepada penerima dalam kaedah tidak ditunjukkan dalam struktur asal.
Berikut ialah kod yang diperbetulkan:
func (guest *Guest) removeFriend(id int) { for i, other := range guest.friends { if other == id { guest.friends = append(guest.friends[:i], guest.friends[i+1:]...) break } } }
Dengan menggunakan penerima penuding (*Tetamu), kaedah tersebut mengubah suai hirisan rakan struct Guest asal, memastikan elemen dialih keluar dengan betul.
Penjelasan:
Apabila hirisan diluluskan mengikut nilai, kaedah penerima beroperasi pada salinan hirisan. Apabila pengubahsuaian dibuat pada kepingan, ia hanya ditunjukkan dalam salinan, bukan dalam kepingan asal. Walau bagaimanapun, menggunakan penerima penunjuk membenarkan kaedah untuk mengubah suai kepingan asal, kerana penerima kini penunjuk kepada struktur asal.
Contoh Penggunaan:
guest := &Guest{ id: 1, name: "Bob", surname: "Pats", friends: []int{1, 2, 3, 4, 5}, } fmt.Println(guest) guest.removeFriend(3) fmt.Println(guest)
Output:
&{1 Bob Pats [1 2 3 4 5]} &{1 Bob Pats [1 2 4 5]}
Atas ialah kandungan terperinci Mengapakah Menggunakan Penerima Nilai Membawa kepada Pengubahsuaian Slice yang Tidak Betul dalam Go Struct?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!