Maison  >  Article  >  développement back-end  >  Comment supprimer des éléments d’une tranche de manière itérative dans Go ?

Comment supprimer des éléments d’une tranche de manière itérative dans Go ?

DDD
DDDoriginal
2024-10-30 21:07:30568parcourir

How to Remove Elements from a Slice Iteratively in Go?

Supprimer des éléments d'une tranche de manière itérative

Lors d'une itération sur une tranche, la suppression d'un élément dans la boucle peut être délicate en raison du décalage de éléments ultérieurs. Une approche incorrecte courante consiste à utiliser append pour supprimer un élément, comme le montre l'exemple ci-dessous :

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

Cette méthode ne fonctionne pas correctement car la boucle ne prend pas en compte les éléments décalés. Pour supprimer correctement des éléments lors de l'itération, vous pouvez soit utiliser une boucle descendante, soit employer une méthode alternative qui évite les opérations de copie constantes.

Boucle descendante

Une boucle descendante itère dans ordre inverse, en commençant par le dernier élément. Cette approche vous permet de supprimer des éléments sans avoir à décrémenter manuellement les variables de boucle :

<code class="go">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:]...)
    }
}</code>

Méthode alternative pour de nombreuses suppressions

Si vous devez supprimer un grand nombre de éléments, l’utilisation de append peut être inefficace en raison d’une copie excessive. Une approche alternative consiste à créer une nouvelle tranche et à copier uniquement les éléments non amovibles :

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

Suppression sur place pour de nombreuses suppressions (usage général)

Une technique de suppression sur place consiste à conserver deux indices et à attribuer des éléments non amovibles dans la même tranche tout en remettant à zéro les emplacements des éléments supprimés :

<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
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 for garbage collection
}
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