Maison > Article > développement back-end > Comment supprimer des éléments d’une tranche de manière itérative dans 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!