Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mengalih keluar Elemen daripada Slice dalam Struct in Go?

Bagaimana untuk mengalih keluar Elemen daripada Slice dalam Struct in Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-14 16:29:02544semak imbas

How to Remove Elements from a Slice Within a Struct in Go?

Mengalih keluar Elemen daripada Slice dalam Struct

In Go, struct ialah agregat medan, yang boleh termasuk kepingan. Apabila kaedah cuba mengubah suai penerima (iaitu, struktur itu sendiri), ia mesti menggunakan penerima penuding untuk mengemas kini nilai asal dan bukannya membuat salinan.

Pertimbangkan kod berikut:

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 mengalih keluar elemen daripada kepingan "rakan" dalam struct "Tetamu". Walau bagaimanapun, cubaan untuk mengalih keluar elemen daripada struct asal mengakibatkan menimpa elemen yang diingini dan mendarabkan elemen terakhir, seperti yang dilihat dalam contoh:

guest1.friends = [1, 2, 3, 4, 5]
guest1.removeFriend(3)
// Result: guest1.friends = [1, 2, 4, 5, 5]

Untuk membetulkan isu ini, anda mesti menggunakan penerima penuding:

func (self *Guest) removeFriend(id int) {
    // ... (Same implementation)
}

Dengan menggunakan penerima penuding, anda menetapkan nilai kepingan baharu (dipulangkan dengan "tambah()") kepada medan "rakan" bagi struct asal "Tetamu", mengurangkan panjang hirisan sebanyak 1 dengan berkesan.

Selain itu, disyorkan untuk menggunakan nama penerima yang lebih idiomatik, seperti "tetamu" atau "g," dan bukannya "diri sendiri."

Atas ialah kandungan terperinci Bagaimana untuk mengalih keluar Elemen daripada Slice dalam Struct in Go?. 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