Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Saya Memerlukan Penerima Penunjuk untuk Mengeluarkan Elemen daripada Slice dalam Struct?

Mengapa Saya Memerlukan Penerima Penunjuk untuk Mengeluarkan Elemen daripada Slice dalam Struct?

Barbara Streisand
Barbara Streisandasal
2024-11-17 11:29:02975semak imbas

Why Do I Need a Pointer Receiver to Remove an Element from a Slice in a Struct?

Mengalih keluar Elemen daripada Slice dalam Struct

Untuk mengalih keluar elemen daripada kepingan dalam struct, anda mesti menggunakan penerima penunjuk , bukannya penerima nilai. Penerima nilai mengubah suai salinan struktur asal, manakala penerima penuding mengubah suai struktur asal itu sendiri.

Contoh Kod

Pertimbangkan kod ini untuk mengalih keluar rakan daripada Struktur tetamu:

type Guest struct {
    id      int
    name    string
    surname string
    friends []int
}

func (self Guest) removeFriend(id int) {
    for i, other := range self.friends {
        if other == id {
            self.friends = append(self.friends[:i], self.friends[i+1:]...)
            break
        }
    }
}

Kod ini tidak akan berfungsi kerana ia menggunakan penerima nilai, (Tetamu sendiri). Untuk mengubah suai struktur asal, anda mesti menggunakan penerima penunjuk, (diri Tetamu)*.

Kod Betul

func (self *Guest) removeFriend(id int) {
    for i, other := range self.friends {
        if other == id {
            self.friends = append(self.friends[:i], self.friends[i+1:]...)
            break
        }
    }
}

Sekarang, memanggil guest1.removeFriend(3) akan mengalih keluar rakan dengan ID 3 daripada guest1 struct.

Nota:

Juga ambil perhatian bahawa menggunakan nama penerima seperti (diri) dan (ini) bukan idiomatik dalam Go. Sebaliknya, gunakan nama struct, seperti (tetamu).

Atas ialah kandungan terperinci Mengapa Saya Memerlukan Penerima Penunjuk untuk Mengeluarkan Elemen daripada Slice dalam 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