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