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

Pourquoi la modification du pointeur dans les fonctions Go n'affecte-t-elle parfois pas la valeur d'origine ?

Susan Sarandon
Libérer: 2024-10-27 11:30:30
original
746 Les gens l'ont consulté

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Modification du pointeur en Go, comprendre les différences

En Go, lors du passage d'un pointeur vers une fonction, on a généralement l'intention de modifier la valeur pointé par ce pointeur. Généralement, cela peut être réalisé via le déréférencement, comme illustré dans le code suivant :

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}</code>
Copier après la connexion

Cependant, il peut y avoir des cas où la valeur de la structure pointée par le pointeur passé reste inchangée, même après sa modification. au sein de la fonction. Pour comprendre pourquoi cela se produit, examinons un extrait de code modifié :

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}</code>
Copier après la connexion

Cet extrait de code tente de modifier la valeur du pointeur p, mais ne parvient pas à changer la valeur de la structure pointée à l'origine. La raison en est que l'affectation p = &Test{4} dans la fonction f() ne modifie que la valeur de la variable locale p.

Dans la fonction f(), p est traité comme une variable locale , et lui attribuer une nouvelle valeur n’affecte pas la valeur du pointeur transmis par la fonction main(). Par conséquent, la structure pointée par p reste inchangée, reflétée dans la valeur inchangée de i.Value une fois imprimée.

En revanche, le code suivant démontre l'approche correcte pour modifier la valeur de la structure :

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}</code>
Copier après la connexion

Dans ce code, p.Value = 4 modifie directement le champ Value de la structure pointée par p. Cela entraîne la modification souhaitée de la valeur de la structure, qui se reflète dans la valeur mise à jour de i.Value lors de l'impression.

Il convient de noter que l'attribution d'une nouvelle valeur au pointeur lui-même (comme dans p = &Test{ 4}) a un effet différent. Cette affectation créerait un nouveau pointeur pointant vers une nouvelle structure, mais n'affecterait pas la valeur de la structure pointée par le pointeur d'origine transmis par la fonction main().

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.cn
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!