Удаление элементов из Слайса в 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]
Итак, мы можем преобразовать простой скрипт, удаляющий элемент из слайса, в функцию. Функцию можно просто использовать для передачи слайса и индекса элемента и удаления элемента из слайса.