Removing Slice Elements Within a Loop
Effectively removing elements from a slice within a loop can be tricky. An incorrect but common approach is to use append inside a range-based loop:
<code class="go">for i := range a { // BAD if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
However, this approach would result in loop variables getting out of sync and skipped elements.
Correct Loop-Based Removal
Instead, consider manually decrementing the loop variable after removing an element:
<code class="go">for i := 0; i < len(a); i++ { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) i-- } }
Downward Looping for Multiple Removals
If multiple elements may need to be removed, downward looping ensures the shifted elements remain outside the loop's iteration:
<code class="go">for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
Alternate for Many Removals
For extensive removals, consider copying non-removable elements to a new slice, avoiding numerous copy operations:
<code class="go">b := make([]string, len(a)) copied := 0 for _, s := range(a) { if !conditionMeets(s) { b[copied] = s copied++ } } b = b[:copied]</code>
In-Place Removal with Cycling
To perform in-place removal, maintain two indices, assigning non-removable elements while zeroing out removed ones:
<code class="go">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 } a = a[:copied]</code>
The above is the detailed content of How to Remove Elements from a Slice Within a Loop in Go: What Are the Best Practices?. For more information, please follow other related articles on the PHP Chinese website!