Cómo borrar un elemento de una rebanada en el Golang

Suraj Joshi 20 noviembre 2021
  1. Crear subcortes de una slice dada
  2. Borrar elementos de la slice en Go
Cómo borrar un elemento de una rebanada en el Golang

En Go, slice es un array de tamaño variable que tiene indexación a partir del array pero su tamaño no es fijo ya que puede ser redimensionado. Cualquier elemento de una rebanada puede ser eliminado de la rebanada debido a su naturaleza dinámica. Borrar un elemento de una rebanada es bastante diferente de otros lenguajes debido a la ausencia de funciones incorporadas en Go a borrar un elemento de una rebanada.

Crear subcortes de una slice dada

Antes de sumergirnos en la eliminación de un elemento de un trozo, veremos la creación de un subtramo de un trozo dado, ya que es uno de los principales componentes para eliminar un elemento de un trozo.

package main

import "fmt"

func main() {
    var Slice1 = []int{1, 2, 3, 4}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := Slice1[:2]
    fmt.Printf("slice2: %v\n", Slice2)
}

Producción :

slice1: [1 2 3 4]
slice2: [1 2]

Aquí, la rebanada 2 es una sub-rebanada formada por la rebanada 1 que contiene todos los elementos desde el principio, es decir, desde el índice 0 hasta el índice 2-1, es decir, 1. Note aquí que la indexación de la rebanada en Go comienza desde 0.

package main

import "fmt"

func main() {
    var Slice1 = []int{1, 2, 3, 4}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := Slice1[2:]
    fmt.Printf("slice2: %v\n", Slice2)
}

Producción :

slice1: [1 2 3 4]
slice2: [3 4]

Aquí, slice2 es una subcategoría formada por slice1 que contiene todos los elementos desde el índice 2 hasta el final de la slice.

Borrar elementos de la slice en Go

La tarea de eliminar elementos de rebanada puede realizarse con diferentes enfoques basados en nuestros requerimientos. Las diversas formas de eliminar un elemento de slice se discuten a continuación:

Cuando el orden es importante

Si deseamos mantener el orden de los cortes después de eliminar el elemento, desplazamos la posición de todos los elementos a la derecha de los elementos eliminados hacia la izquierda por uno.

package main

import "fmt"

func remove(slice []int, s int) []int {
    return append(slice[:s], slice[s+1:]...)
}

func main() {
    var Slice1 = []int{1, 2, 3, 4, 5}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := remove(Slice1, 2)
    fmt.Printf("slice2: %v\n", Slice2)
}

Producción :

slice1: [1 2 3 4 5]
slice2: [1 2 4 5]

Aquí se forma la rebanada 2 después de quitar el elemento en el índice 2 de la rebanada 1.

Cuando el orden no es importante

package main

import "fmt"

func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    return s[:len(s)-1]
}

func main() {
    var Slice1 = []int{1, 2, 3, 4, 5}
    fmt.Printf("slice1: %v\n", Slice1)

    Slice2 := remove(Slice1, 2)
    fmt.Printf("slice2: %v\n", Slice2)
}

Producción :

slice1: [1 2 3 4 5]
slice2: [1 2 5 4]

Aquí se forma la rebanada 2 después de quitar el elemento del índice 2 de la rebanada 1, pero el orden de los elementos no se conserva aquí. Es más rápido que el método anterior.

Así que, cuando el orden tiene una mayor prioridad que la velocidad, usamos el primer método y si la velocidad tiene una mayor prioridad que el orden, usamos el segundo método para eliminar un elemento de una rebanada.

Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

Artículo relacionado - Go Slice