Remove Elements from a Slice Iteratively
When iterating over a slice, removing an element within the loop can be tricky due to the shifting of subsequent elements. A common incorrect approach is using append to remove an element, as seen in the example below:
<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>
This method does not work correctly because the loop does not account for the shifted elements. To properly remove elements while iterating, you can either use a downward loop or employ an alternative method that avoids constant copy operations.
Downward Loop
A downward loop iterates in reverse order, starting from the last element. This approach allows you to remove elements without having to manually decrement loop variables:
<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>
Alternate Method for Many Removals
If you need to remove a large number of elements, using append can be inefficient due to excessive copying. An alternative approach is to create a new slice and copy only the non-removable elements:
<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>
In-Place Removal for Many Removals (General Purpose)
An in-place removal technique involves maintaining two indices and assigning non-removable elements in the same slice while zeroing out removed element locations:
<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>
The above is the detailed content of How to Remove Elements from a Slice Iteratively in Go?. For more information, please follow other related articles on the PHP Chinese website!