Maison  >  Article  >  développement back-end  >  Comment supprimer en toute sécurité des éléments d’une tranche lors d’une itération en Go ?

Comment supprimer en toute sécurité des éléments d’une tranche lors d’une itération en Go ?

DDD
DDDoriginal
2024-10-27 17:38:02632parcourir

How to Safely Remove Elements from a Slice While Iterating in Go?

Supprimer des éléments d'une tranche dans une boucle

Supprimer des éléments d'une tranche tout en itérant dessus à l'aide d'une boucle de plage n'est pas possible en raison de la façon dont les tranches fonctionnent en interne. Cependant, il existe des méthodes alternatives pour y parvenir :

Utiliser une boucle manuelle et décrémenter l'index

Une approche consiste à utiliser une boucle manuelle avec la fonction len() pour suivre la longueur de la tranche. Lorsqu'un élément est supprimé, l'index doit être décrémenté pour éviter de sauter l'élément suivant. Par exemple :

for i := 0; i < len(a); i++ {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
        i--
    }
}

Utilisation d'une boucle vers le bas

Une meilleure alternative consiste à utiliser une boucle vers le bas pour éviter d'avoir besoin d'un ajustement manuel de l'index :

for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}

Copie d'éléments non amovibles

Pour les scénarios dans lesquels de nombreux éléments doivent être supprimés, copier les éléments non amovibles dans une nouvelle tranche peut être plus efficace :

b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]

Suppression sur place

Une technique de suppression sur place maintient deux indices et attribue des éléments non amovibles dans la même tranche :

copied := 0
for i := 0; i < len(a); i++ {
    if !conditionMeets(a[i]) {
        a[copied] = a[i]
        copied++
    }
}
for i := copied; i < len(a); i++ {
    a[i] = "" // Zero places of removed elements
}
a = a[:copied]

En utilisant des méthodes appropriées, vous pouvez supprimer efficacement des éléments d'une tranche au sein d'une boucle sans rencontrer d'erreurs liées au déplacement d'éléments dû à la suppression.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn