"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 anexar a uma cópia do Go Slice altera o original?

Por que anexar a uma cópia do Go Slice altera o original?

Publicado em 2024-11-20
Navegar:192

Why Does Appending to a Go Slice Copy Change the Original?

Compreendendo o comportamento da fatia no Go: por que o acréscimo altera a fatia original?

No trecho de código fornecido, temos uma função someFunc que opera em uma fatia de inteiros. Dentro da função, uma fatia temporária tempA é criada e recebe o valor da fatia de entrada A. No entanto, ao anexar a tempA, o A original também é modificado. Esse comportamento pode parecer contra-intuitivo, então vamos explorar por que isso ocorre.

No Go, as fatias são declaradas como um tipo de dados []T, onde T representa o tipo de elemento. Apesar do nome, uma fatia não é uma coleção de elementos armazenados contíguamente na memória. Em vez disso, é uma estrutura de cabeçalho contendo as seguintes informações:

  • Comprimento: o número de elementos na fatia
  • Capacidade: o número de elementos que a matriz subjacente pode conter
  • Ponteiro: uma referência à matriz subjacente onde os dados da fatia são armazenados

Quando você atribui o valor de uma variável de fatia, você não está copiando a matriz inteira. Em vez disso, você está criando um novo cabeçalho de fatia que aponta para a mesma matriz subjacente. Assim, ao realizar uma operação como anexar a tempA, você também está modificando o array subjacente e, consequentemente, os valores na fatia A original.

Esse comportamento é essencial para garantir o gerenciamento eficiente da memória e evitar desnecessários copiando. Ao usar uma abordagem baseada em ponteiro, as fatias Go podem compartilhar a mesma matriz subjacente, mantendo valores separados de comprimento e capacidade. Isso permite modificações leves em fatias sem a necessidade de operações de cópia caras.

Para uma compreensão mais profunda do comportamento das fatias e das estruturas de dados subjacentes, consulte o seguinte recurso: https://blog.golang.org/ fatias

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