Удалить элементы в срезе в Golang

Опубликовано: 7 Января, 2023

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

Удаление элементов в срезе

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

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

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

Go




// 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 в срезе. Теперь мы перейдем к фактическому удалению операции в срезе.

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

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

Приведенный выше код добавит номера срезов[:index], поскольку индекс равен 3, числа[: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




// 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. ", 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 элементов в срез в функции добавления.

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

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

func delete_at_index(slice []int, index int) []int {

return append(slice[:index], slice[index+1:]…)

}

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

Go




// 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. ", 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]

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