Удаление элементов из Слайса в Golang

Слайс (Slice) в Golang — это массив (список элементов одного типа), но он динамический, т. е. может регулировать свой размер в соответствии с элементами, добавляемыми в программу . Мы можем инициализировать слайс без указания начальной длины или размера, это позволяет нам динамически добавлять в него элементы. Таким образом, могут быть случаи, когда вам нужно удалить элементы из cлайса. В Golang интерфейс слайсов не имеет встроенной функции для удаления элементов в слайсах. Итак, в этой статье мы разберемся, как удалять элементы в слайсе.


Чтобы удалить элемент из слайса, мы не можем напрямую удалить элемент из него, нам нужно выполнить определенное копирование всех элементов в другое место, а затем переместить их в новую позицию в исходном слайс. Для этого сначала мы построим простой слайс, заполним его элементами, а затем удалим элемент на основе его индекса. Учитывая индекс элементов, которые нужно удалить из слайса, мы добавим все элементы после этого индекса в слайс, который содержит все элементы до этого индекса.


Эта операция добавления в конечном итоге изменит существующий фрагмент и удалит элемент, разбив исходный фрагмент на два фрагмента и снова объединив их.

Использование функции append для удаления элемента 

Мы создаем слайс и добавляем в него элементы, теперь удаляем из него элементы. Итак, мы собираемся удалить элемент, ссылаясь на его индекс в слайсе. Чтобы удалить элементы по ссылке, сначала создадим переменную для хранения индекса элемента, индексную переменную также можно взять в виде входных или передать откуда-то еще. Используя эту индексную переменную, мы можем получить доступ к элементам слайса, как видно из следующего примера:

  // Go program to find the index of
// the element from the given slice
package main
 
import "fmt"
 
func main() {
     
    // Declaring an slice 
    numbers := []int{10, 20, 30, 40, 50, 90, 60}
    fmt.Println("Slice:", numbers)
 
    var index int = 3
     
    // Get the element at a provided index in the slice
    elem := numbers[index]
    fmt.Println("Element at index 3 is:", elem)
}

Вывод:

Slice: [10 20 30 40 50 90 60]
Element at index 3 is: 40

Итак, по индексу 3 у нас есть элемент 40 в слайсе. Теперь мы перейдем к фактическому удалению операции в слайсе. 


Нам нужно использовать функцию append в Golang, которая будет принимать два параметра.


Во-первых, это сам слайс, к которому мы хотим добавить, а следующий параметр — это то, что мы хотим добавить, т. е. элементы, которые нужно добавить в слайс. Здесь мы добавим все элементы слайса после предоставленного индекса в слайс со всеми элементами до предоставленного индекса.

numbers = append(numbers[:index], numbers[index+1:]…)

Приведенный выше код добавит номера слайсов numbers[:index], поскольку индекс равен 3, numbers[:3] станут [10, 20, 30]. И слайс, который мы добавляем к числам [3+1:], так это [50, 90, 60]. Тем самым мы исключили элемент с индексом = 3, разбив слайс на два слайса.

numbers = { 10, 20, 30, 40, 50, 90, 60 }
index   ->  0,  1 , 2 , 3 , 4 , 5 , 6
 

numbers[:index]  append  -> numbers[index+1]
        ^                            ^
        |                            |
    numbers[:3]                    numbers[4:]         
   [10, 20, 30]                   [50, 90, 60]                  (index = 3)
   
number = { 10, 20, 30, 50, 90, 60 }   -> element 40 (index = 3) deleted            

Здесь слайс становится [10, 20, 30, 50, 90, 60], поэтому мы удалили элемент 40 с индексом 3 из слайса. Итак, синтаксически мы можем преобразовать это в скрипт Golang, который добавляет слайсы в исходный массив. Поскольку функция добавления возвращает измененный фрагмент, нам нужно присвоить его исходному фрагменту.

// Go program to delete the element from the given slice
package main
import "fmt"
 
func main() {
     
    // Declaring a slice
    numbers := []int{10, 20, 30, 40, 50, 90, 60}
    fmt.Println("Original Slice:", numbers)
     
    var index int = 3
 
    // Get the element at the provided index in the slice
    elem := numbers[index]
     
    // Using append function to combine two slices
    // first slice is the slice of all the elements before the given index
    // second slice is the slice of all the elements after the given index
    // append function appends the second slice to the end of the first slice
    // returning a slice, so we store it in the form of a slice
    numbers = append(numbers[:index], numbers[index+1:]...)
 
    fmt.Printf("The element %d was deleted.\n", elem)
    fmt.Println("Slice after deleting elements:", numbers)
}

Вывод:

Original Slice: [10 20 30 40 50 90 60]
The element 40 was deleted.
Slice after deleting elements: [10 20 30 50 90 60]

Здесь мы добавили … в конце параметра в функцию добавления, чтобы указать на передачу n аргументов в последний параметр функции. Здесь, поскольку распределение слайса является динамическим, мы должны передать его так, чтобы передать n элементов в слайс в функции добавления. 


Функция добавления возвращает слайс после добавления элементов в слайс, поэтому мы сохраняем возвращаемое значение функции добавления в тот же исходный слайс. здесь мы не создаем никаких дополнительных слайсов явным образом, хотя функция добавления может создавать промежуточные слайсы, чтобы добавить один слайс в другой. 


Пример: теперь мы можем создать функцию, которая принимает слайс, индекс удаляемого элемента и возвращает слайс после удаления элемента из слайса. Тип возвращаемого значения функции будет слайсом этого конкретного типа слайса. Здесь мы оставим его int, но это могут быть строки, bool и другие допустимые типы данных в Golang. Функция будет принимать в качестве параметров слайс и индекс элемента, поэтому мы создаем функцию следующим образом:

func delete_at_index(slice []int, index int) []int {
return append(slice[:index], slice[index+1:]…)
}

Функция будет принимать два параметра: слайс и индекс, который является индексом удаляемого элемента. Тип возвращаемого значения функции — []int, что указывает на фрагмент типа int. Тело функции простое: оно возвращает вызов функции добавления. Функция добавления принимает два параметра, как мы обсуждали в предыдущем разделе, и, таким образом, возвращает слайс после удаления элемента из слайса.

// Go program to delete the element from the given slice
package main
 
import "fmt"
 
// Function that takes two parameters
// a slice which has to be operated on
// the index of the element to be deleted from the slice
// return value as a slice of integers
 
func delete_at_index(slice []int, index int) []int {
     
    // Append function used to append elements to a slice
    // first parameter as the slice to which the elements 
    // are to be added/appended second parameter is the 
    // element(s) to be appended into the slice
    // return value as a slice
    return append(slice[:index], slice[index+1:]...)
}
 
func main() {
     
    // Declaring a slice
    numbers := []int{10, 20, 30, 40, 50, 90, 60}
    fmt.Println("Original Slice:", numbers)
 
    var index int = 3
     
    // Get the element at a given index in the slice
    elem := numbers[index]
     
    // Call the function delete_at_index which 
    // returns a slice of integers
    numbers = delete_at_index(numbers, index)
 
    fmt.Printf("The element %d was deleted.\n", elem)
    fmt.Println("Slice after deleting element:", numbers)
}

Вывод:

Original Slice: [10 20 30 40 50 90 60]
The element 40 was deleted.
Slice after deleting element: [10 20 30 50 90 60]

Итак, мы можем преобразовать простой скрипт, удаляющий элемент из слайса, в функцию. Функцию можно просто использовать для передачи слайса и индекса элемента и удаления элемента из слайса.