Классика из 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, я собрал в дорожной карте.
Теги: