Como eliminar um elemento de uma fatia em Golang

  1. Criar subplacas a partir de uma determinada fatia
  2. Eliminar elementos da fatia em Go

Em Go, slice é uma array de tamanho variável que tem indexação como de array, mas seu tamanho não é fixo, pois pode ser redimensionado. Qualquer elemento de uma slice pode ser excluído da slice por causa de sua natureza dinâmica. A exclusão de um elemento de uma slice é bastante diferente de outros idiomas devido à ausência de funções integradas em Go para excluir um elemento de uma slice.

Criar subplacas a partir de uma determinada fatia

Antes de mergulharmos fundo na eliminação de um elemento de uma slice, vamos dar uma olhada na criação de uma slice a partir de uma determinada slice, pois é um dos principais componentes para a eliminação de um elemento de uma slice.

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)
}

Resultado:

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

Aqui, slice2 é um sub-slice formado a partir de slice1 que contém todos os elementos desde o início, ou seja, índice 0 até o índice 2-1, ou seja, 1. Observe aqui que a indexação de slice em Go começa a partir de 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)
}

Resultado:

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

Aqui, slice2 é um sub-slice formado de slice1 que contém todos os elementos do índice 2 até o final da fatia.

Eliminar elementos da fatia em Go

A tarefa de eliminar elementos do slice pode ser realizada em diferentes abordagens com base em nossas exigências. As várias maneiras de excluir um elemento da slice são discutidas abaixo:

Quando a ordem é importante

Se desejarmos manter a ordem das fatias após a remoção do elemento, deslocamos a posição de todos os elementos à direita dos elementos eliminados para a esquerda por um.

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)
}

Resultado:

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

Aqui a slice2 é formada após a remoção do elemento no índice 2 da slice1.

Quando a ordem não é 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)
}

Resultado:

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

Aqui a slice2 é formada após a remoção do elemento no índice 2 da slice1, mas a ordem dos elementos não é preservada aqui. Ela é mais rápida do que o método anterior.

Assim, quando a ordem tem uma prioridade maior do que a velocidade, utilizamos o primeiro método e se a velocidade tem uma prioridade maior do que a ordem, utilizamos o segundo método para excluir um elemento de uma slice.

Artigo relacionado - Go Slice

  • Concatenar duas fatias em Go