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