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

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

DDD
Libérer: 2024-10-27 17:38:02
original
637 Les gens l'ont consulté

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

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:]...)
    }
}
Copier après la connexion

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

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

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!

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
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!