Maison >développement back-end >Golang >Comment supprimer efficacement des éléments d'une Go Slice tout en maintenant l'ordre ?

Comment supprimer efficacement des éléments d'une Go Slice tout en maintenant l'ordre ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-29 07:19:31912parcourir

 How to Efficiently Remove Elements from a Go Slice While Maintaining Order?

Suppression efficace des éléments de tranche

Dans Go, supprimer des éléments d'une tranche tout en maintenant l'ordre nécessite une approche prudente. La méthode couramment utilisée de append(a[:i], a[i 1:]...) devient peu pratique dans une boucle car elle peut perturber la variable de la boucle.

Approche itérative

Au lieu d'utiliser une boucle de plage, envisagez une approche itérative qui commence depuis le début de la tranche :

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

Cette approche garantit que la boucle traite correctement tous les éléments et décrémente la variable de boucle pour tenir compte de la tranche décalée.

Boucle vers le bas pour plus d'efficacité

Une méthode encore plus efficace consiste à parcourir la tranche dans l'ordre inverse. Cela élimine le besoin de décrémenter manuellement la variable de boucle :

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

Alternativement, si de nombreuses suppressions sont nécessaires, envisagez de copier les éléments non amovibles dans une nouvelle tranche :

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

Cette approche minimise les allocations de mémoire et les opérations de copie.

Suppression sur place avec mise à zéro

Pour une suppression à usage général, envisagez une approche sur place qui copie les éléments non amovibles vers l'avant et met à zéro les éléments 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>

Cette approche est efficace et permet au GC de récupérer des valeurs inaccessibles.

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