Como eliminar um elemento de uma fatia em Golang
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.
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn