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!