"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 você move um item de fatia no Go sem criar duplicatas?

Como você move um item de fatia no Go sem criar duplicatas?

Publicado em 2024-11-10
Navegar:115

How do you move a slice item in Go without creating duplicates?

Movendo um item de fatia no Go: entendendo as técnicas corretas

Atravessar fatias no Go geralmente envolve reorganizar seus elementos. A tentativa de mover diretamente um item de uma posição para outra pode levar a resultados inesperados, conforme demonstrado no snippet de código fornecido:

slice := []int{0,1,2,3,4,5,6,7,8,9}

indexToRemove := 1
indexWhereToInsert := 4

slice = append(slice[:indexToRemove], slice[indexToRemove 1:]...)
newSlice := append(slice[:indexWhereToInsert], 1)
slice = append(newSlice, slice[indexWhereToInsert:]...)

Esta abordagem pretende mudar o item em indexToRemove para indexWhereToInsert, mas a saída exibe duas cópias do item movido. O erro está na forma como o item é retirado e inserido. Vamos explorar uma abordagem alternativa:

Utilizando funções personalizadas para manipulação de itens

Em vez de modificar manualmente a fatia, podemos criar funções dedicadas para inserção e remoção:

func insertInt(array []int, value int, index int) []int {
    return append(array[:index], append([]int{value}, array[index:]...)...)
}

func removeInt(array []int, index int) []int {
    return append(array[:index], array[index 1:]...)
}

Movendo itens com precisão

Com essas funções auxiliares, mover um item é simples:

func moveInt(array []int, srcIndex int, dstIndex int) []int {
    value := array[srcIndex]
    return insertInt(removeInt(array, srcIndex), value, dstIndex)
}

Exemplo de implementação e saída

func main() {
    slice := []int{0,1,2,3,4,5,6,7,8,9}

    fmt.Println("Original slice:", slice)

    slice = insertInt(slice, 2, 5)
    fmt.Println("After insertion:", slice)

    slice = removeInt(slice, 5)
    fmt.Println("After removal:", slice)

    slice = moveInt(slice, 1, 4)
    fmt.Println("After moving:", slice)
}

Saída:

Original slice: [0 1 2 3 4 5 6 7 8 9]
After insertion: [0 1 2 3 4 2 5 6 7 8 9]
After removal: [0 1 2 3 4 5 6 7 8 9]
After moving: [0 2 1 3 4 5 6 7 8 9]

Essa abordagem muda corretamente o item do índice 1 para o índice 4, resultando na saída esperada.

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