Eliminar elementos de un sector de forma iterativa
Al iterar sobre un sector, eliminar un elemento dentro del bucle puede ser complicado debido al cambio de elementos posteriores. Un enfoque incorrecto común es utilizar append para eliminar un elemento, como se ve en el siguiente ejemplo:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
Este método no funciona correctamente porque el bucle no tiene en cuenta los elementos desplazados. Para eliminar elementos correctamente durante la iteración, puede utilizar un bucle descendente o emplear un método alternativo que evite operaciones de copia constantes.
Bucle descendente
Un bucle descendente itera en orden inverso, comenzando desde el último elemento. Este enfoque le permite eliminar elementos sin tener que disminuir manualmente las variables del bucle:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
Método alternativo para muchas eliminaciones
Si necesita eliminar una gran cantidad de elementos, usar append puede resultar ineficaz debido a la copia excesiva. Un enfoque alternativo es crear un nuevo segmento y copiar solo los elementos no extraíbles:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
if !conditionMeets(s) {
b[copied] = s
copied
}
}
b = b[:copied]
Eliminación in situ para muchas eliminaciones (propósito general)
Una técnica de eliminación in situ implica mantener dos índices y asignar no elementos extraíbles en el mismo segmento mientras se ponen a cero las ubicaciones de los elementos eliminados:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3