"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 > Por que embaralhar uma fatia afeta uma fatia atribuída a ela no Go?

Por que embaralhar uma fatia afeta uma fatia atribuída a ela no Go?

Publicado em 2024-11-11
Navegar:613

Why does shuffling a slice affect a slice assigned to it in Go?

Manipulação de array em Go

No Go, arrays são tipos de valor, e atribuir um array a outro cria uma cópia de todos os seus elementos. Isso é válido mesmo ao passar um array para uma função, pois ele receberá uma cópia em vez de uma referência de memória.

Pergunta original

Uma consulta foi levantada sobre o seguinte código:

package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}

O autor expressou confusão sobre por que arr2 foi afetado pela função shuffle, apesar de sua expectativa de arr2 e arr serem entidades distintas.

Esclarecimento

O problema decorre de um mal-entendido entre matrizes e fatias.

Arrays vs. Slices

Arrays são coleções de valores de comprimento fixo, enquanto slices são referências dinâmicas a arrays subjacentes. No exemplo de código fornecido, nenhuma matriz é usada.

Manipulação de fatia

A linha arr := []int{1, 2, 3, 4, 5} cria uma fatia referenciando uma matriz subjacente anônima. A linha arr2 := arr subsequente simplesmente duplica esta referência, resultando em arr e arr2 apontando para o mesmo array subjacente.

Comportamento da função

Ao passar arr para o função shuffle, uma cópia da fatia é criada, não a matriz subjacente. Esta cópia é modificada pela função, e é por isso que arr2 também é afetado quando arr é modificado.

Conclusão

No Go, as fatias se comportam como referências a matrizes subjacentes. Atribuir uma fatia a outra copia a referência, não a matriz subjacente. Este conceito é crucial para entender a manipulação de fatias em Go.

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