Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengeluarkan Elemen daripada Slice Secara Berulang dalam Go?

Bagaimana untuk Mengeluarkan Elemen daripada Slice Secara Berulang dalam Go?

DDD
DDDasal
2024-10-30 21:07:30568semak imbas

How to Remove Elements from a Slice Iteratively in Go?

Alih Keluar Elemen daripada Slice Secara Berulang

Apabila melelaran di atas kepingan, mengalih keluar elemen dalam gelung boleh menjadi sukar kerana peralihan unsur-unsur seterusnya. Pendekatan biasa yang salah ialah menggunakan append untuk mengalih keluar elemen, seperti yang dilihat dalam contoh di bawah:

<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}</code>

Kaedah ini tidak berfungsi dengan betul kerana gelung tidak mengambil kira elemen yang dialihkan. Untuk mengalih keluar elemen dengan betul semasa melelakan, anda boleh sama ada menggunakan gelung ke bawah atau menggunakan kaedah alternatif yang mengelakkan operasi penyalinan berterusan.

Gelung Ke Bawah

Gelung ke bawah berulang dalam susunan terbalik, bermula dari elemen terakhir. Pendekatan ini membolehkan anda mengalih keluar elemen tanpa perlu mengurangkan pembolehubah gelung secara manual:

<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}</code>

Kaedah Ganti untuk Banyak Penyingkiran

Jika anda perlu mengalih keluar sejumlah besar elemen, menggunakan append boleh menjadi tidak cekap kerana penyalinan yang berlebihan. Pendekatan alternatif ialah membuat kepingan baharu dan menyalin hanya elemen yang tidak boleh ditanggalkan:

<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]</code>

Penyingkiran Di Tempat untuk Banyak Pembuangan (Tujuan Umum)

Teknik penyingkiran di tempat melibatkan mengekalkan dua indeks dan menetapkan elemen tidak boleh alih dalam kepingan yang sama sambil menyifar lokasi elemen yang dialih keluar:

<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i < len(a); i++ {
    if !conditionMeets(a[i]) {
        a[copied] = a[i]
        copied++
    }
}
for i := copied; i < len(a); i++ {
    a[i] = "" // Zero places of removed elements for garbage collection
}
a = a[:copied]</code>

Atas ialah kandungan terperinci Bagaimana untuk Mengeluarkan Elemen daripada Slice Secara Berulang dalam 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