Rumah >pembangunan bahagian belakang >Golang >Mengapakah Menggunakan Penerima Nilai Membawa kepada Pengubahsuaian Slice yang Tidak Betul dalam Go Struct?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-17 05:03:031047semak imbas

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
        }
    }
}

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!

Kenyataan:
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