go - Eliminar elemento en un sector
(5)
func main() {
a := []string{"Hello1", "Hello2", "Hello3"}
fmt.Println(a)
// [Hello1 Hello2 Hello3]
a = append(a[:0], a[1:]...)
fmt.Println(a)
// [Hello2 Hello3]
}
¿Cómo funciona este truco de eliminación con la función de agregar?
Parece que está agarrando todo antes del primer elemento (matriz vacía)
A continuación, agregando todo después del primer elemento (posición cero)
¿Qué hace el ... (punto punto punto)?
... es sintaxis para argumentos variados.
Creo que es implementado por el compilador usando slice ( []Type)
, al igual que la función append:
func append(slice []Type, elems ...Type) []Type
cuando usa "elems" en "append", en realidad es un slice ([] type). Entonces " a = append(a[:0], a[1:]...)
" significa " a = append(a[0:0], a[1:])
"
a[0:0]
es una porción que no tiene nada
a[1:]
es "Hello2 Hello3"
Así es como funciona
Donde a
es la porción, i
es el índice del elemento que desea eliminar:
a = append(a[:i], a[i+1:]...)
...
es la sintaxis de los argumentos variados en Go.
Básicamente, al definir una función, coloca todos los argumentos que pasa en una porción de ese tipo. Al hacerlo, puede pasar tantos argumentos como desee (por ejemplo, fmt.Println
puede tomar tantos argumentos como desee).
Ahora, cuando se llama a una función, ...
hace lo contrario: desempaqueta una porción y las pasa como argumentos separados a una función variadica.
Entonces, ¿qué hace esta línea?
a = append(a[:0], a[1:]...)
Es esencial:
a = append(a[:0], a[1], a[2])
Ahora, usted se estará preguntando, ¿por qué no solo hacer
a = append(a[:1]...)
Bueno, la definición de función de append
es
func append(slice []Type, elems ...Type) []Type
Entonces, el primer argumento tiene que ser una porción del tipo correcto, el segundo argumento es el variadic, entonces pasamos un segmento vacío, y luego desempaquetamos el resto del segmento para completar los argumentos.
En la wiki de golang, muestra algunos trucos para slice, incluido eliminar un elemento de slice.
Enlace: ingrese la descripción del enlace aquí
Por ejemplo, a es la porción en la que desea eliminar el elemento número i.
a = append(a[:i], a[i+1:]...)
O
a = a[:i+copy(a[i:], a[i+1:])]
Hay dos opciones:
A: te importa retener el orden de matriz:
a = append(a[:i], a[i+1:]...)
// or
a = a[:i+copy(a[i:], a[i+1:])]
B: No le importa retener el pedido (probablemente sea más rápido):
a[i] = a[len(a)-1] // Replace it with the last one.
a = a[:len(a)-1] // Chop off the last one.
Consulte el enlace para ver las consecuencias de las fugas de memoria si su matriz es de punteros.
O bien, ya que está tratando de encontrar el índice del elemento que se va a eliminar de todos modos,
// na = new a, da = a that''s to be deleted
var na []string
for _, v := range a {
if v == da {
continue
} else {
na = append(na, v)
}
}
a = na
OK no importa. Respuesta correcta para el tema, pero respuesta incorrecta para el cuerpo de la pregunta.