Maison  >  Article  >  développement back-end  >  Pourquoi les variables Go sont-elles écrasées lorsque plusieurs tranches sont ajoutées ?

Pourquoi les variables Go sont-elles écrasées lorsque plusieurs tranches sont ajoutées ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-24 07:59:02197parcourir

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

Les variables Go sont écrasées (bug ?)

Ce problème se produit lors de la définition de plusieurs variables, chacune étant définie en ajoutant un élément à une tranche existante. , mais une variable est écrasée lorsque la seconde est définie.

Considérez l'extrait de code suivant :

<code class="go">for i := 0; i < len(prePaths); i++ {
    route := prePaths[i]
    nextA := nextLine[i]
    nextB := nextLine[i+1]

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

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

Le problème réside dans la deuxième ligne de la boucle, où 'pathA' et 'pathB' sont définis comme des tranches ajoutées à un élément. Cependant, l’ajout à une tranche ne crée pas une nouvelle tranche ; au lieu de cela, il modifie la tranche existante.

Dans ce scénario, « route » est la tranche existante à laquelle elle est ajoutée. Ainsi, lorsque « pathA » est créé, il partage le même tableau sous-jacent que « route ». Par la suite, lorsque « pathB » est créé, il partage également le même tableau que « pathA ».

Puisque « pathB » est la dernière tranche ajoutée, le dernier élément du tableau sous-jacent est défini sur la valeur ajoutée. vers 'cheminB'. Par conséquent, « pathA », qui partage le même tableau, reflète également ce changement. Cela explique pourquoi 'pathA' est écrasé lorsque 'pathB' est défini.

Pour résoudre ce problème, il faut créer des tranches indépendantes pour 'pathA' et 'pathB'. Ceci peut être réalisé en utilisant les fonctions « make » et « copy ».

Voici un extrait de code modifié qui crée des tranches indépendantes :

<code class="go">for i := 0; i < len(prePaths); i++ {
    newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i])+1)*2)
    copy(newRoute, prePaths[i])

    nextA := nextLine[i]
    nextB := nextLine[i+1]

    pathA := append(newRoute, nextA)
    pathB := append(prePaths[i], nextB)

    postPaths = append(postPaths, pathA)
    postPaths = append(postPaths, pathB)
}</code>

Dans ce code, « newRoute » est un nouvelle tranche créée à l'aide de la fonction 'make', garantissant qu'elle contient des données indépendantes. La fonction 'copy' est ensuite utilisée pour copier les données de 'prePaths[i]' dans la nouvelle tranche 'newRoute'. Ensuite, « pathA » et « pathB » sont définis à l’aide de tranches indépendantes, résolvant ainsi le problème initial.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn