Как удалить элемент из слайса в Go: два способа

Классика из SliceTricks:

s = append(s[:i], s[i+1:]...)

Порядок элементов сохраняется, сложность O(n).

С Go 1.21 то же самое есть в стандартной библиотеке:

s = slices.Delete(s, i, i+1)

Советую именно slices.Delete. Начиная с Go 1.22 функция обнуляет освободившийся хвост слайса. Для слайса указателей это важно: при ручном append удалённый объект остаётся в подлежащем массиве, и GC не может его собрать.

Если порядок не важен, есть способ за O(1). Поставьте последний элемент на место удаляемого:

s[i] = s[len(s)-1]
s = s[:len(s)-1]

Так удаление из середины миллионного слайса стоит столько же, сколько удаление с конца.

Что ещё почитать про базовые типы Go, я собрал в дорожной карте.


Теги: