Загрузка…
Загрузка…
Go · junior · сложность 4
Если порядок элементов не имеет значения, наиболее эффективная стратегия удаления — заменить удаляемый элемент последним элементом slice, а затем сократить slice на единицу.
Найдите индекс i элемента, который нужно удалить.
Назначьте s[i] = s[len(s)-1].
Уменьшите длину: s = s[:len(s)-1].
O(1) за время (без смещения всех последующих элементов).
Минимальное количество копий по сравнению с удалением по порядку.
Хорошо масштабируется для больших коллекций и горячих циклов.
Порядок элементов меняется после операции.
Требуется проверка корректности индекса.
Для slice с типами указателей иногда целесообразно обнулить хвост.
элемент перед усечением, чтобы избежать сохранения избыточных ссылок в памяти.
Когда стабильный порядок не является требованием бизнес-логики, «обмен с последним + усечение» — это канонический и самый быстрый способ удалить элемент из slice в Go.
func removeUnorderedT any []T {
last := len(s) - 1
s[i] = s[last]
var zero T
s[last] = zero // опційно: щоб не тримати зайве посилання
return s[:last]
}Если порядок элементов не имеет значения, наиболее эффективная стратегия удаления — заменить удаляемый элемент последним элементом slice, а затем сократить slice на единицу.