Maison  >  Article  >  développement back-end  >  Pourquoi la définition d’une variable Go écrase-t-elle l’autre ?

Pourquoi la définition d’une variable Go écrase-t-elle l’autre ?

DDD
DDDoriginal
2024-10-24 08:09:30877parcourir

Why Does Setting One Go Variable Overwrite the Other?

Les variables Go sont écrasées

Dans ce code, l'auteur rencontre un problème où la variable pathA est écrasée lors de la définition de pathB. Cela suggère que les deux variables font référence au même tableau sous-jacent, ce qui entraîne des modifications de l'une affectant l'autre.

Le problème provient de l'utilisation de la fonction append() avec des tranches dans Go. Lors de l'ajout d'un élément à une tranche, Go vérifie si le tableau sous-jacent a une capacité suffisante pour accueillir le nouvel élément. Sinon, il alloue un tableau plus grand et copie les éléments existants.

Dans le code fourni, la route slice est utilisée pour créer à la fois le cheminA et le cheminB. Si la capacité du tableau de route sous-jacent est dépassée lors de l’ajout à pathA ou pathB, un nouveau tableau est alloué. Cependant, puisque pathA et pathB sont dérivés de la même tranche, ils partagent le même tableau sous-jacent.

Pour éviter ce problème, il est nécessaire de créer une copie indépendante de la route avant de l'utiliser pour initialiser pathA et pathB. Ceci peut être réalisé en utilisant les fonctions make() et copy(), comme indiqué dans la deuxième modification de l'auteur :

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

pathA := append(newRoute, nextA)
pathB := append(prePaths[i], nextB)</code>

Dans ce code révisé, newRoute est une tranche distincte avec son propre tableau sous-jacent. Cela garantit que pathA et pathB ont des copies indépendantes des données, empêchant les modifications apportées à l'une d'affecter l'autre.

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