Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-10-24 07:59:02
original
197 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!