Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-10-28 05:01:30
original
189 Les gens l'ont consulté

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>
Copier après la connexion

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--
    }
}
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!