Удаление элемента из слайса в Go не особенно интуитивно понятно. В отличие от других языков, в Go нет встроенной функции для этой цели. Если вам интересно, как можно удалить элемент из фрагмента Go, приведенные ниже фрагменты кода должны дать ответы, которые вы ищете.
Давайте рассмотрим несколько стратегий удаления элементов из слайса в Go. В первых двух разделах ниже предполагается, что вы хотите изменить срез на месте. Если вы хотите создать копию фрагмента с удаленным элементом, оставив оригинал как есть, перейдите к разделу « Сохранить исходный фрагмент» ниже.
Если порядок фрагментов не важен
Если порядок элементов в срезе не важен, вы можете скопировать последний элемент в индекс, который хотите удалить, а затем обрезать срез до последнего элемента, как показано ниже:
Разновидность приведенного выше решения, которая потенциально более удобочитаема, состоит в том, чтобы скопировать первый элемент в указанный индекс, а затем обрезать срез из второго индекса. Тонкое отличие этого решения от предыдущего заключается в том, что емкость среза не сохраняется, что делает этот метод потенциально менее производительным, если вы будете добавлять к срезу позже.
Как правило, первый подход предпочтительнее второго, если только вы не уверены, что не будете добавлять к срезу позже.
Если порядок фрагментов важен
Если вы хотите сохранить порядок элементов в срезе, вы можете использовать следующую технику, известную как повторное слайсинг , которая использует встроенную функцию добавления :
Этот метод дороже, чем первый, потому что вы объединяете два новых фрагмента вместе, чтобы создать третий, используя append вместо одного назначения и одной копии в предыдущем разделе.
Сохранить исходный фрагмент
Оба рассмотренных выше решения так или иначе изменяют исходный срез. Если это нежелательно, вам нужно создать новый слайс с другим базовым массивом перед добавлением к нему. Обязательно присвойте результат removeElement новой переменной, чтобы сохранить доступ к оригиналу.
Вот вариант метода повторного нарезки , который оставляет исходный срез removeElement без изменений:
Как видите, это решение сохраняет исходный sслайс после removeElementвызова, и дальнейшие модификации nsпостфактум sтакже не приводят к изменению.
Удалить элементы из среза во время итерации
Если вы хотите удалить несколько элементов из среза в Go во время итерации по нему, убедитесь, что вы выполняете итерацию от конца слайса к началу. Если вы сделаете это наоборот, ваша программа будет паниковать с ошибкой индекса за пределами границ из-за того, что длина среза продолжает уменьшаться каждый раз, когда элемент удаляется.
Вот пример, который удаляет все четные целые числа из среза:
Заключение
Вы должны быть в состоянии использовать описанные выше методы для решения любой проблемы, связанной с удалением элемента из слайса в Go.
Спасибо за чтение и удачного кодирования!