"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como remover elementos de uma fatia iterativamente no Go?

Como remover elementos de uma fatia iterativamente no Go?

Publicado em 2024-11-07
Navegar:198

How to Remove Elements from a Slice Iteratively in Go?

Remover elementos de uma fatia iterativamente

Ao iterar sobre uma fatia, remover um elemento dentro do loop pode ser complicado devido à mudança de elementos subsequentes. Uma abordagem incorreta comum é usar anexar para remover um elemento, como visto no exemplo abaixo:

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

Este método não funciona corretamente porque o loop não leva em conta os elementos deslocados. Para remover elementos adequadamente durante a iteração, você pode usar um loop descendente ou empregar um método alternativo que evite operações de cópia constantes.

Loop descendente

Um loop descendente itera em ordem inversa, começando pelo último elemento. Essa abordagem permite remover elementos sem precisar diminuir manualmente as variáveis ​​de loop:

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:]...)
    }
}

Método alternativo para muitas remoções

Se você precisar remover um grande número de elementos, usar anexar pode ser ineficiente devido ao excesso de cópias. Uma abordagem alternativa é criar uma nova fatia e copiar apenas os elementos não removíveis:

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]

Remoção no local para muitas remoções (uso geral)

Uma técnica de remoção no local envolve manter dois índices e atribuir não- elementos removíveis na mesma fatia enquanto zera os locais dos elementos removidos:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i 
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3