Maison  >  Article  >  développement back-end  >  Comment supprimer des éléments d'une tranche dans une boucle en Go : quelles sont les meilleures pratiques ?

Comment supprimer des éléments d'une tranche dans une boucle en Go : quelles sont les meilleures pratiques ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 05:01:30190parcourir

How to Remove Elements from a Slice Within a Loop in Go: What Are the Best Practices?

Suppression d'éléments de tranche dans une boucle

Supprimer efficacement des éléments d'une tranche dans une boucle peut être délicat. Une approche incorrecte mais courante consiste à utiliser append dans une boucle basée sur une plage :

<code class="go">for i := range a { // BAD
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}</code>

Cependant, cette approche entraînerait une désynchronisation des variables de boucle et des éléments ignorés.

Corriger la suppression basée sur la boucle

Au lieu de cela, envisagez de décrémenter manuellement la variable de boucle après la suppression d'un élément :

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

Boucle vers le bas pour plusieurs suppressions

Si plusieurs éléments doivent être supprimés, la boucle vers le bas garantit que les éléments décalés restent en dehors de l'itération de la boucle :

<code class="go">for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}</code>

Alterner pour de nombreuses suppressions

Pour des suppressions importantes, pensez à copier les éléments non amovibles dans une nouvelle tranche, en évitant de nombreuses opérations de copie :

<code class="go">b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]</code>

Suppression sur place avec cyclage

À effectuer dans -placer la suppression, conserver deux indices, attribuer les éléments non amovibles tout en mettant à zéro ceux supprimés :

<code class="go">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]</code>

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