Mengapakah Menggunakan Penerima Nilai Membawa kepada Pengubahsuaian Slice yang Tidak Betul dalam Go Struct?

Patricia Arquette
Lepaskan: 2024-11-17 05:03:03
asal
977 orang telah melayarinya

Why Does Using a Value Receiver Lead to Incorrect Slice Modification in a Go Struct?

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

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

Output:

&{1 Bob Pats [1 2 3 4 5]}
&{1 Bob Pats [1 2 4 5]}
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan