"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 a substituição de variável ocorre em Go ao anexar fatias do mesmo array?

Por que a substituição de variável ocorre em Go ao anexar fatias do mesmo array?

Publicado em 2024-11-10
Navegar:523

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Causa da substituição de variáveis ​​em Go

Seu código encontra um problema de substituição de variáveis ​​porque você está criando novas fatias (caminhoA e caminhoB) anexando elementos à mesma matriz de apoio (rota) dentro de um loop.

Plano de fundo do Slices in Go:

  • A Go slice é uma estrutura de dados que representa um bloco contíguo de elementos do mesmo tipo.
  • As fatias têm um comprimento (o número de elementos armazenados atualmente) e uma capacidade (o número máximo de elementos que podem conter).
  • Quando você modifica uma fatia, isso pode acionar a alocação de uma nova matriz de apoio se a capacidade for excedida.

Problema com seu Código:

Em seu código, você está criando duas novas fatias, pathA e pathB, usando a função de acréscimo:

pathA := append(route, nextA)
pathB := append(route, nextB)

Aqui está o que acontece:

  1. Inicialmente, route tem uma capacidade que pode acomodar nextA e nextB. Portanto, duas novas fatias (pathA e pathB) são criadas com a mesma matriz de apoio da rota.
  2. À medida que o loop avança e você continua anexando à rota, sua capacidade eventualmente excede seu comprimento.
  3. Na iteração subsequente do loop, um novo array de apoio é alocado para rota. No entanto, pathA e pathB ainda se referem ao antigo array de apoio.
  4. Quando você anexa nextB à rota, ele grava no último elemento do antigo array de apoio, que é compartilhado por pathA e pathB.
  5. Como resultado, tanto o caminhoA quanto o caminhoB terminam com o mesmo final value.

Solução:

Para evitar essa substituição, você precisa garantir que pathA e pathB tenham matrizes de apoio exclusivas. Você pode conseguir isso criando manualmente uma nova fatia para uma delas usando make e copy:

newRoute := make([]int, len(route), (cap(route) 1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}
Declaração de lançamento Este artigo foi reimpresso em: 1729727920 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
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