迭代地從切片中刪除元素
迭代切片時,由於移動而在循環中刪除元素可能會很棘手後續元素。常見的錯誤方法是使用追加來刪除元素,如下例所示:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
此方法無法正常運作,因為循環不考慮移位的元素。若要在迭代時正確刪除元素,您可以使用向下循環或採用避免不斷複製操作的替代方法。
向下循環
向下循環迭代相反的順序,從最後一個元素開始。這種方法允許您刪除元素,而無需手動遞減循環變數:
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:]...)
}
}
多次刪除的替代方法
如果需要刪除大量元素,由於複製過多,使用追加可能效率低下。另一種方法是建立一個新切片並僅複製不可移動元素:
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]
多次刪除的就地刪除(通用)
就地刪除技術涉及維護兩個索引並分配非同一切片中的可移除元素,同時將已移除元素位置清除:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3