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