Maison  >  Article  >  développement back-end  >  Pourquoi la modification du pointeur dans les fonctions Go n'affecte-t-elle parfois pas la valeur d'origine ?

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

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 11:30:30747parcourir

 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>

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>

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>

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!

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